[英]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.