我有一个非常大的XML文件,我需要获取包含特定参数的所有节点(不同的公司信息)。 XML解压缩大约12 GB。
<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不会解析它。所以我把它枪杀了。 提前感谢您的帮助。
答案 0 :(得分:0)
错误消息告诉它。某处某处使用32位int来存储文件的大小或文件中的位置。
首先,请检查您是否正在运行64位Python。如果你打算将内容保存在RAM中,如果用12 GiB数据文件提供它,32位Python很可能会窒息。
其次,您可能想尝试另一个解析器。最容易尝试的是xml.etree.cElementTree
(当然你可以尝试非C版本,但这样会太慢)。如果它窒息,请尝试lxml
并使您的代码使用iterparse
。 cElementTree
是标准发布的一部分,lxml
必须单独安装。
您可以通过查看此问题和答案获得一些想法:using lxml and iterparse() to parse a big (+- 1Gb) XML file