9

lxml.etree.iterparse()用来遍历一个大的 XML 文件。

我想知道我在解析输入文件方面已经走了多远,以便获得进度指示器。

我的第一个想法是用来os.stat( filename ).st_size知道我的 XML 文件有多大,然后当我从解析器获取事件时,检索文件中的当前位置。但我不知道如何lxml.etree让我访问它的内部位置。iterparse()将文件名作为其source参数,因此我无法自己打开文件并调用其tell()方法来了解到目前为止已读取了多少字节。

您是否知道lxml.etree当前解析器进程的任何内置指标?或者你有整合这样一个进展的想法吗?

4

2 回答 2

9

您可以将文件对象传递给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)
于 2013-06-12T18:06:14.137 回答
0

你不应该使用

with open(filename, 'r') as f:

因为它会导致较大文件中的内存错误。最好遍历文件并只计算行数,这样您就可以猜测文件还剩下多少。

于 2020-11-06T18:12:17.233 回答