我正在使用 lxml.etree.iterparse()
遍历大型 XML 文件。
我想知道我对输入文件的解析进行到什么程度,以便我可以获得进度指示器。
我的第一个想法是使用 os.stat( filename ).st_size
来了解我的 XML 文件有多大,然后当我从解析器获取事件时,检索文件中的当前位置文件。但我无法弄清楚 lxml.etree
如何让我访问其内部位置。 iterparse()
将文件名作为其 source
参数,因此我无法自己打开文件并调用其 tell()
方法来已知到目前为止已经读取了多少字节。
您是否知道当前解析器进度的任何 lxml.etree
内置指示器?或者您有整合这样一个进程的想法吗?
最佳答案
您可以将一个文件对象传递给iterparse
,然后调用f.tell()
。
这将为您提供元素在文件中的大致位置。
import lxml.etree as ET
import os
filename = 'data.xml'
total_size = os.path.getsize(filename)
with open(filename, 'r') as f:
context = ET.iterparse(f, events=('end', ), tag='Record')
for event, elem in context:
print(event, elem, float(f.tell())/total_size)
会产生类似的东西
(u'end', <Element Record at 0xb743e2d4>, 0.09652665470688218)
(u'end', <Element Record at 0xb743e2fc>, 0.09652665470688218)
(u'end', <Element Record at 0xb743e324>, 0.09652665470688218)
...
(u'end', <Element Record at 0xb744739c>, 1.0)
(u'end', <Element Record at 0xb74473c4>, 1.0)
(u'end', <Element Record at 0xb74473ec>, 1.0)
关于python - 在 Python : how to know how much of the input file has been read? 中使用 lxml 迭代 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072126/