【问题标题】:Iteratively parse a large XML file without using the DOM approach在不使用 DOM 方法的情况下迭代解析大型 XML 文件
【发布时间】:2012-04-19 21:24:32
【问题描述】:

我有一个 xml 文件

<temp>
  <email id="1" Body="abc"/>
  <email id="2" Body="fre"/>
  .
  .
  <email id="998349883487454359203" Body="hi"/>
</temp>

我想读取每个电子邮件标签的 xml 文件。也就是说,有一次我想读取电子邮件 id=1..从中提取正文,读取的电子邮件 id=2...并从中提取正文...等等

我尝试使用 DOM 模型进行 XML 解析,因为我的文件大小为 100 GB..该方法不起作用。然后我尝试使用:

  from xml.etree import ElementTree as ET
  tree=ET.parse('myfile.xml')
  root=ET.parse('myfile.xml').getroot()
  for i in root.findall('email/'):
              print i.get('Body')

现在,一旦我获得了 root..我不明白为什么我的代码无法解析。

使用 iterparse 时的代码抛出以下错误:

 "UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 437: ordinal not in range(128)"

谁能帮忙

【问题讨论】:

  • 我试过了,但考虑到我的文件大小,有人建议我使用“lxml”,我也没有完全了解如何使用 iterparse。另外,非常感谢您的回复。 :)
  • 你试过xml.etree.ElementTree.iterparse()吗?
  • @Dikie 感谢您的回复 :) 实际上我没有得到 iterparse 的概念,虽然我已经尝试从ibm.com/developerworks/xml/library/x-hiperfparse 学习它..有人可以通过一个例子来解释它。
  • @JannatArora LXML 支持 SAX 解析。

标签: python xml xml-parsing lxml


【解决方案1】:

iterparse 的一个例子:

import cStringIO
from xml.etree.ElementTree import iterparse

fakefile = cStringIO.StringIO("""<temp>
  <email id="1" Body="abc"/>
  <email id="2" Body="fre"/>
  <email id="998349883487454359203" Body="hi"/>
</temp>
""")
for _, elem in iterparse(fakefile):
    if elem.tag == 'email':
        print elem.attrib['id'], elem.attrib['Body']
    elem.clear()

只需将 fakefile 替换为您的真实文件即可。 另请阅读this 了解更多详情。

【讨论】:

  • 你忘了说iterparse应该来自哪里。
  • +1,但对于 100GB 的文件,我会使用 iterparse 的 LXML 版本。
  • @Dikie 非常感谢您的帮助。代码抛出错误:UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 437: ordinal not in range(128) 我也尝试转换为字符串,但它仍然不起作用
  • 您可能必须使用codecs.open 打开文件才能正确处理 unicode 字符。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 2012-08-01
  • 1970-01-01
  • 2021-08-16
  • 2018-12-22
  • 1970-01-01
  • 2021-05-20
  • 2013-12-24
相关资源
最近更新 更多