Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不使用DOM方法的情况下迭代解析大型XML文件_Python_Xml_Xml Parsing_Lxml - Fatal编程技术网

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

Python 在不使用DOM方法的情况下迭代解析大型XML文件,python,xml,xml-parsing,lxml,Python,Xml,Xml Parsing,Lxml,我有一个xml文件 <temp> <email id="1" Body="abc"/> <email id="2" Body="fre"/> . . <email id="998349883487454359203" Body="hi"/> </temp> 现在,一旦我得到根..我不明白为什么我的代码不能解析 使用iterparse时的代码引发以下错误: "UnicodeEncodeError: 'ascii'

我有一个xml文件

<temp>
  <email id="1" Body="abc"/>
  <email id="2" Body="fre"/>
  .
  .
  <email id="998349883487454359203" Body="hi"/>
</temp>
现在,一旦我得到根..我不明白为什么我的代码不能解析

使用iterparse时的代码引发以下错误:

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

有人能帮忙吗?举个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()
导入cStringIO
从xml.etree.ElementTree导入iterparse
fakefile=cStringIO.StringIO(“”)
""")
对于iterparse(伪造文件)中的元素:
如果elem.tag==“电子邮件”:
打印元素attrib['id'],元素attrib['Body']
元素清除()
只要用真实的文件替换伪造的文件。
也请阅读了解更多详细信息。

我尝试过,但考虑到我的文件大小,有人建议我使用“lxml”,而且我也不知道如何使用iterparse。另外,非常感谢您的回复。:)您是否尝试过
xml.etree.ElementTree.iterparse()
?@Dikie感谢您的回答:)事实上,我不了解iterparse的概念,虽然我试着从…开始研究它,但有人能用一个例子来解释一下吗。@JannatArora LXML支持SAX解析。你忘了说
iterparse
应该从哪里来。+1,但是对于一个100GB的文件,我会使用
iterparse
@Dikie的LXML版本,非常感谢你的帮助。代码抛出错误:UnicodeEncodeError:“ascii”编解码器无法对位置437处的字符u'\u20ac'进行编码:序号不在范围内(128)我也尝试过转换为字符串,但仍然不起作用您可能必须使用
编解码器打开文件。打开
才能正确处理unicode字符。
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()