我正在使用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)
Run Code Online (Sandbox Code Playgroud)
会产生类似的东西
(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)
Run Code Online (Sandbox Code Playgroud)