我正在使用lxml.etree.iterparse()
来遍历大型XML文件。
我想知道我在解析输入文件方面有多远,所以我可能会得到一个进度指示器。
我的第一个想法是使用os.stat( filename ).st_size
来了解我的XML文件有多大,然后当我从解析器获取事件时,检索文件中的当前位置。但我无法弄清lxml.etree
如何让我访问其内部位置。 iterparse()
将文件名作为其source
参数,因此我无法打开文件并调用其tell()
方法来知道到目前为止已读取了多少字节。
您是否了解当前解析器进展的任何lxml.etree
内置指标?或者您是否想要整合这样的进展?
答案 0 :(得分:6)
您可以将文件对象传递给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)
答案 1 :(得分:0)
您不应使用
with open(filename, 'r') as f:
因为它会导致较大文件中的内存错误。最好遍历文件并只计算行数,这样您就可以猜测还剩下多少文件。