gpt4 book ai didi

python - 使用 Python 解析大型拆分 XML 文件

转载 作者:行者123 更新时间:2023-12-03 09:20:46 25 4
gpt4 key购买 nike

我有一个非常大的 XML 日志文件,它会以固定大小 (~200MB) 自动分割。可以有很多部分(通常少于 10 个)。当它拆分时,它不会在记录末尾甚至当前行末尾整齐地进行拆分。一旦达到目标大小,它就会 split 。

基本上,我需要解析这些文件中的“记录”元素,然后从每个文件中提取 time 子元素

由于这些日志文件在随机位置分割并且不一定有根,因此我使用 Python3 和 lxml 的 etree.iterparse 以及 html=True。这是处理由于分割文件而导致缺少根节点的情况。但是,我不确定如何处理最终在一个文件的末尾和另一个文件的开头之间分割的记录。

这是分割文件的一个小示例。

文件:test.001.txt

<records>
<record>
<data>5</data>
<time>1</time>
</record>
<record>
<data>5</data>
<time>2</time>
</record>
<record>
<data>5</data>
<ti

文件:test.002.txt

me>3</time>
</record>
<record>
<data>6</data>
<time>4</time>
</record>
<record>
<data>6</data>
<time>5</time>
</record>
</records>

这是我尝试过的方法,但我知道它不能正常工作:

from lxml import etree
xmlFiles = []
xmlFiles.append('test.001.txt')
xmlFiles.append('test.002.txt')
timeStamps = []
for xmlF in xmlFiles:
for event, elem in etree.iterparse(xmlF, events=("end",), tag='record',html=True):
tElem = elem.find('time')
if tElem is not None:
timeStamps.append(int(tElem.text))

输出:

In[20] : timeStamps
Out[20]: [1, 2, 4, 5]

那么有没有一种简单的方法来捕获在文件之间分割的第三条记录?我真的不想提前合并文件,因为它们可能很多而且很大。此外,除此之外的任何其他速度/内存管理技巧 Using Python Iterparse For Large XML Files ...接下来我会弄清楚该怎么做。时间戳的附加似乎可能有问题,因为可能有很多时间戳......但我无法真正分配,因为我不知道提前有多少。

最佳答案

当然。创建一个行为类似于文件的类(通过提供read方法),但实际上从多个文件获取输入,同时向调用者隐藏这一事实。像这样的东西:

class Reader (object):
def __init__(self):
self.files = []

def add(self, src):
self.files.append(src)

def read(self, nbytes=0):
if not len(self.files):
return bytes()

data = bytes()
while True:
data = data + self.files[0].read(nbytes - len(data))
if len(data) == nbytes:
break

self.files[0].close()
self.files.pop(0)
if not len(self.files):
break

return data

此类维护打开文件的列表。如果“最顶层”文件无法满足读取请求,则该文件将被关闭,并尝试从后续文件进行读取。这一直持续到我们读取足够的字节或用完文件为止。

鉴于上述情况,如果我们这样做:

r = Reader()
for path in ['file1.txt', 'file2.txt']:
r.add(open(path, 'rb'))

for event, elem in etree.iterparse(r):
print event, elem.tag

我们得到(使用您的示例输入):

end data
end time
end record
end data
end time
end record
end data
end time
end record
end data
end time
end record
end data
end time
end record
end records

关于python - 使用 Python 解析大型拆分 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com