在加载大文件时显示python的XML解析器的进度

Nat*_*han 3 python xml pyqt

我使用Python的内置XML解析器来加载1.5 gig XML文件,这需要一整天.

from xml.dom import minidom
xmldoc = minidom.parse('events.xml')
Run Code Online (Sandbox Code Playgroud)

我需要知道如何进入并测量其进度,以便我可以显示进度条.有任何想法吗?

minidom有另一个叫做parseString()的方法,它返回一个DOM树,假设你传递的字符串是有效的XML,如果我自己将文件拆分成块并一次一个地传递给parseString,我是否可能合并所有的DOM树在最后重新组合在一起?

Ben*_*end 5

您是否考虑过使用其他解析XML的方法?构建这样一个大型XML文件的树总是很慢并且内存密集.如果你不需要在内存中的整个树,基于流的解析会快.如果你已经习惯了基于树的XML操作,那可能会有点令人生畏,但它会以巨大的速度增加(几分钟而不是几小时)的形式付出代价.

http://docs.python.org/library/xml.sax.html


Anu*_*yal 5

你使用case要求你使用sax解析器而不是dom,dom将所有内容加载到内存中,sax会逐行解析,你可以根据需要为事件编写处理程序,这样可以有效,你也可以编写进度指示器

我还建议尝试使用expat解析器,它非常有用 http://docs.python.org/library/pyexpat.html

使用sax进度:

当sax以递增方式读取文件时,您可以将自己传递的文件对象包装起来并跟踪已读取的内容.

编辑:我也不喜欢自己拆分文件和加入DOM的想法,这样你最好编写自己的xml解析器,我建议使用sax解析器我也想知道你在DOM树中读取1.5 gig文件的目的是什么?看起来像萨克斯在这里会更好