python - 在 Python : how to know how much of the input file has been read? 中使用 lxml 迭代 XML

标签 python xml lxml

我正在使用 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/

相关文章:

java将字符串转换为xml并解析节点

java - 在多个标签中包含标签的 XML

python - 如何使用 lxml 从磁盘加载 .xml 文件作为元素树?

python - 为什么 "pip install lxml"不使用提供的轮子,而是尝试编译?

python - 写一个Python方法根据字符串生成拼写错误

python - 如何让 CMake 编译包含 Boost Local Functions 的源文件

python - 需要帮助指定结束 while 条件

xml - 在浏览器中打开 SVG 呈现 XML 代码而不是图像

python - 失去与 MySQL 服务器的连接

Python lxml提取span标签的值