在不使用 DOM 方法的情况下迭代解析大型 XML 文件

Iteratively parse a large XML file without using the DOM approach(在不使用 DOM 方法的情况下迭代解析大型 XML 文件)
本文介绍了在不使用 DOM 方法的情况下迭代解析大型 XML 文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我有一个 xml 文件

I have an xml file

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

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

I want to read the xml file for each email tag. That is, at a time I want to read email id=1..extract body from it, the read email id=2...and extract body from it...and so on

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

I tried to do this using DOM model for XML parsing, since my file size is 100 GB..the approach does not work. I then tried using:

  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..我不明白为什么我的代码无法解析.

Now once I get the root..I am not getting why is my code not been able to parse.

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

The code upon using iterparse is throwing the following error:

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

谁能帮忙

推荐答案

一个iterparse的例子:

An example for 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 了解更多详情.

Just replace fakefile with your real file. Also read this for further details.

这篇关于在不使用 DOM 方法的情况下迭代解析大型 XML 文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

python arbitrarily incrementing an iterator inside a loop(python在循环内任意递增迭代器)
Joining a set of ordered-integer yielding Python iterators(加入一组产生 Python 迭代器的有序整数)
Iterating over dictionary items(), values(), keys() in Python 3(在 Python 3 中迭代字典 items()、values()、keys())
What is the Perl version of a Python iterator?(Python 迭代器的 Perl 版本是什么?)
How to create a generator/iterator with the Python C API?(如何使用 Python C API 创建生成器/迭代器?)
Python generator behaviour(Python 生成器行为)