我尝试使用iterparse()of解析 iTunes 播放列表ElementTree,但出现以下错误:
AttributeError: 'Element' object has no attribute 'xpath'
Run Code Online (Sandbox Code Playgroud)
代码如下:
import xml.etree.ElementTree as ET
context = ET.iterparse(file,events=("start", "end"))
# turn it into an iterator
context = iter(context)
# get the root element
event, root = context.next()
for event, elem in context:
z = elem.xpath(".//key")
elem.clear()
root.clear()
print z
Run Code Online (Sandbox Code Playgroud)
我做错了什么?文件太大了,无论如何我都必须使用iterparse()。
我正在解析700mb文件,我有以下代码在我的测试文件上工作正常,没有行context.iter(context)和事件,elem = context.next().
form xml.etree import cElementTree as ET
source = ("AAT.xml")
context = iter(context)
event, root = context.next()
for event, elem in context:
if event == event("end"):
some processing...
elem.clear()
root.clear()
Run Code Online (Sandbox Code Playgroud)
然而,当我继续iterparse 700mb文件它仍然崩溃.阅读:
清除()树时使用ElementTree.iterparse()时内存使用量是否会增加?
我相信这是因为我需要清除root,但是我已经遵循了上面已经包含的一些教程我不断收到错误:
line 9, in <module>
event, root = context.next()
AttributeError: 'iterparse' object has no attribute 'next'
Run Code Online (Sandbox Code Playgroud)
我还是Python的新手,我无法理解为什么会发生这种情况,据我所知,我与这些例子一致.
我一直在尝试使用iterparse来减少需要处理大型XML文档的脚本的内存占用.这是一个例子.我编写了这个简单的脚本来读取TMX文件并将其拆分为一个或多个输出文件,不超过用户指定的大小.尽管使用iterparse,当我将886MB文件拆分为100MB文件时,脚本会以所有可用内存运行(使用我的8MB中的6.5进行爬行).
难道我做错了什么?为什么内存使用量如此之高?
#! /usr/bin/python
# -*- coding: utf-8 -*-
import argparse
import codecs
from xml.etree.ElementTree import iterparse, tostring
from sys import getsizeof
def startNewOutfile(infile, i, root, header):
out = open(infile.replace('tmx', str(i) + '.tmx'), 'w')
print >>out, '<?xml version="1.0" encoding="UTF-8"?>'
print >>out, '<!DOCTYPE tmx SYSTEM "tmx14.dtd">'
print >>out, roottxt
print >>out, headertxt
print >>out, '<body>'
return out
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-m', '--maxsize', dest='maxsize', required=True, type=float, help='max size (in MB) of output files')
parser.add_argument(dest='infile', help='.tmx file to be …Run Code Online (Sandbox Code Playgroud) 我使用 Pythoniterparse来解析 nessus 扫描的 XML 结果(.nessus 文件)。对意外记录的解析失败,但类似的记录已被正确解析。
XML 文件的一般结构是很多记录,如下所示:
<ReportHost>
<ReportItem>
<foo>9.3</foo>
<bar>hello</bar>
</ReportItem>
<ReportItem>
<foo>10.0</foo>
<bar>world</bar>
</ReportHost>
<ReportHost>
...
</ReportHost>
Run Code Online (Sandbox Code Playgroud)
换句话说,很多主机(ReportHost)有很多要报告的项目(ReportItem),并且后者具有多个特征(foo,bar)。我将考虑为每个项目生成一行及其特征。
解析在文件中间的简单行处失败(foo在这种情况下是cvss_base_score)
<cvss_base_score>9.3</cvss_base_score>
Run Code Online (Sandbox Code Playgroud)
同时解析了约 200 条相似的行,没有出现任何问题。
相关的代码片段如下——它设置上下文标记(inReportHost它inReportEvent告诉我在 XML 文件的限制中的位置,并根据上下文分配或打印一个值)
import xml.etree.cElementTree as ET
inReportHost = False
inReportItem = False
for event, elem in ET.iterparse("test2.nessus", events=("start", "end")):
if event == 'start' and elem.tag == "ReportHost":
inReportHost = True
if event == 'end' …Run Code Online (Sandbox Code Playgroud) iterparse ×4
python ×4
elementtree ×2
xml ×2
xml-parsing ×2
celementtree ×1
memory ×1
python-2.7 ×1