1

请注意: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()

谢谢!

4

0 回答 0