尝试在Python中解析大型xml文件 - 内存错误

时间:2017-07-28 02:17:54

标签: python xml parsing xml-parsing bigdata

所以我是一名初学者'刮刀'没有一整套编程经验。

我在Canopy环境中使用Python来抓取一些下载的XML文件并使用 xml.dom 解析器来执行此操作。我只是试图从最初的 us-bibliographic-patent-grant 中删除标签(这就是为什么我使用 [0] )只是为了看看我是如何解析和存储整个数据集的;而不是一次完成所有。 xml的摘录如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd" [ ]>
<us-patent-grant lang="EN" dtd-version="v4.2 2006-08-23" file="USD0606726-20091229.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20091214" date-publ="20091229">
<us-bibliographic-data-grant>
<publication-reference>
<document-id>
<country>US</country>
<doc-number>D0606726</doc-number>
<kind>S1</kind>
<date>20091229</date>
</document-id>
</publication-reference>
<application-reference appl-type="design">
<document-id>
<country>US</country>
<doc-number>29299001</doc-number>
<date>20071217</date>

到目前为止我的代码看起来像这样:

from xml.dom import minidom

filename = "C:/Users/SMOLENSK/Documents/Inventor Research/xml_2009/ipg091229.xml"

f = open(filename, 'r')

doc = f.read()

f.close()

xmldata = '<root>' + doc + '</root>'

data = minidom.parse(xmldata)

US_Biblio = xmldata.getElementsByTagName("us-bibliographic-data-grant")[0]

pat_num = US_Biblio.getElementsByTagName("doc-number")[0]

dates = pat_num.getElementsByTagName("date")

for date in dates:
    print(date)

现在我已经在代码完全运行后得到了一些内存错误消息,但它只能运行一次,不幸的是我无法记下究竟发生了什么。由于数据负载很高(仅此文件为460万行),操作每次都会崩溃,而且我无法复制错误。

有没有人能看到错误的代码?我的代码在开始存储每个标记名称之前解析整个数据集,但是可能有办法只解析一定数量的数据吗?也许只需用第一组创建一个新的xml文件。

如果你想知道我用它来绕过

的问题
  

ExpatError:xxx行后的垃圾

我事先得到了。我知道我的编码技巧并不令人惊讶,所以希望我没有做出一个简单而恶心的编程错误。

1 个答案:

答案 0 :(得分:0)

尝试:

with open(filename, 'r') as f:
    data = minidom.parse(f)

如果你真的需要这个标签,你可能需要捣乱一点,也许:

data = minidom.parse(itertools.chain('<root>', f, '</root>')