簡體   English   中英

Python使用XML Iterparse從大型xml文件中刪除元素

[英]Python removing elements from large xml file with xml iterparse

我是Python的新手,最近一直在使用它來嘗試解析700mb的大型xml文件。

環顧四周之后,我一直在嘗試使用iterparse方法刪除XML的稱為Revision_History的元素,因為我們不再需要此信息。

我已經對該腳本進行了一些變體,所以現在它可能是非常錯誤的。 對於前兩次刪除,它似乎工作正常。 但是,它隨后停止工作,並且找不到其他的version_history標簽。

import xml.etree.ElementTree as ET
for event, elem in ET.iterparse("AAT.xml", events=("end",)):
if event == "end":
     for subject in elem.findall ("{http://localhost/namespace}Subject"):
        print ("subject found")
        for revision in subject.findall("("{http://localhost/namespace}Revision_History"):
            print ("revision found")
            subject.remove (revision)
            print ("done")
    elem.clear()

任何建議,不勝感激!

亞當

嘗試使用cElementTree而不是ElementTree。 它已經為我顯著快,但我從來沒有解析文件,你正在分析大小

from xml.etree import cElementTree as ET

其次,嘗試在匹配的元素上使用iterfind()而不是findall()

from xml.etree import cElementTree as ET

for event, elem in ET.iterparse("books.xml", events=("end",)):
    if elem.tag == "book":
        for d in elem.iterfind("description"):
            elem.remove(d)

第三,根據要使用的RAM數量,可以嘗試使用XPath查找具有要刪除的子元素的元素。 然后,遍歷父母,刪除那些孩子。 很差的例子:

for event, elem in ET.iterparse("books.xml", events=("end",)):
    for book_with_desc in elem.iterfind(".//Subject[Revision_History]"):
        for child in book_with_desc:
            if child.tag == "Revision_History":
                remove(child)

使用XPath,如果您知道文檔的結構,請嘗試避免使用.//foo路徑,並編寫更有效的查詢,例如./path/to/element/foo[@attr=bar]或類似文件。

我敢肯定,有更好的方法可以解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM