请注意:Python 的新手用户。
你好,
我正在处理超过 1Gb 的 XML 文件。使用 Python2.7。最初,我使用“iter”来解析 XML。它适用于小文件,但文件如此之大,我遇到了内存错误。然后,我阅读了文档,发现 iter 一次将整个文件加载到内存中,我应该使用 iterparse。我使用并且能够加载 xml 文件并在解析它时进行修改。
我现在面临的问题是如何将这个解析的元素树写入文件。我在 Google 上找到的方法建议使用 ElementTree 的“写入”方法,该方法使用“iter”进行解析,但我的使用 iterparse 进行解析。
下面是我的代码片段。我注释了行,因为代码的内部逻辑非常大。我唯一苦苦挣扎的部分是将更新的树写入“output_pre”文件。
我的xml文件的结构是这样的:
<users>
<user pin=''>
</user>
<user pin=''>
</user>
</users>
代码(内部逻辑已被删除):
----------------解析器---------------
import xml.etree.cElementTree as ET2
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element
output_pre = open("pre_ouput.xml", 'w')
tree = ET2.iterparse("temp-output-preliminary.xml")
for event, elem in tree:
if elem.tag == "users":
pass
if elem.tag == "user":
userContent = list(elem)
#Number of children will help filter dummy users in user-state file.
numberOfChildren = len(userContent)
#assert numberOfChildren != 3
PIN = elem.get('pin')
assert PIN is not None
analysing += 1
logger.info ("Analysing user number: %d", analysing)
if numberOfChildren <= 2:
if numberOfChildren >=4:
if numberOfChildren == 3:
for e in ids:
node = ET2.Element("property", {eid: PROV_DATA})
elem.append(node)
container_id_set.add(e)
tree.write(output_pre, encoding='unicode')
output_pre.write("\n</perk-users")
output_pre.close()
谢谢!