我有一个相当大的XML文件,我需要获得包含特定参数的所有节点(不同的公司信息)。解压后的XML大约有12gb。
<Companies xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...>
<Company id="782634892" source="abcd">
<attribution>abcde</attribution>
<name xml:lang="en">company name</name>
<Phones>
<Phone type="phone" hide="0">
<formatted>+1800111</formatted>
<country>1</country>
<prefix>800</prefix>
<number>111</number>
</Phone>
</Phones>
<Rubrics>
<rubric ref="184107947"/>
</Rubrics>
还有一大堆东西,但这并不重要。
我的代码很简单:
file = open('companies2.xml')
data = file.read()
dom = parseString(data)
key = dom.getElementsByTagName("Company")
for elements in key:
rubricsArray = elements.getElementsByTagName("Rubrics")[0].getElementsByTagName("rubric")
for rub in rubricsArray:
if rub.attributes["ref"].value == '32432793389':
print elements.toxml()
它在我为测试而制作的一个较小的文件上工作。但这里没有。
Traceback (most recent call last):
File "./XMLparse.py", line 29, in <module>
dom = parseString(data)
File "/usr/lib/python2.7/xml/dom/minidom.py", line 1930, in parseString
return expatbuilder.parseString(string)
File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line 940, in parseString
return builder.parseString(string)
File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line 223, in parseString
parser.Parse(string, True)
OverflowError: size does not fit in an int
有什么好主意吗?我尝试使用gz文件,但zmore创建了一些随机的第一行:
------> companies2.xml.gz <------
DOM不会解析它。所以我把它拉上了拉链。谢谢你的帮助。
错误消息告诉它。某个地方使用32位int来存储文件的大小或文件中的位置。
首先,请检查您运行的是64位Python。如果您打算将内容保存在RAM中,则为32位Python提供12gib数据文件很可能会阻塞。
第二,您可能需要尝试另一个解析器。最容易尝试的是xml.etree.cElementTree
(当然你可以尝试非c版本,但那太慢了)。如果它阻塞,那么尝试lxml
并使您的代码使用iterparse
。cElementTree
是标准发行版的一部分,lxml
必须单独安装。
通过查看这个问题和答案,您可能会得到一些想法:使用lxml和iterparse()解析一个大的(+- 1Gb) XML文件