[英]Modify large xml file using lxml
語言:-Python 2.7.6
檔案大小:-1.5 GB
XML格式
<myfeed>
<product>
<id>876543</id>
<name>ABC</name>
....
</product>
<product>
<id>876567</id>
<name>DEF</name>
....
</product>
<product>
<id>986543</id>
<name>XYZ</name>
....
</product>
我必須
A)讀取所有節點<product>
B)刪除其中一些節點(如果<id>
屬性的文本在python set()中
C)更新/更改幾個節點(如果<id>
屬性的文本在python dict中
D)追加/寫入一些新節點
問題是我的XML文件很大(大約1.5 GB)。 我進行了一些研究,並決定將lxml用於所有這些目的。
我正在嘗試將iterparse()與element.clear()配合使用,因為它不會消耗我的所有內存。
for event, element in etree.iterparse(big_xml_file,tag = 'product'):
for child in element:
if child.tag == unique_tag:
if child.text in products_id_hash_set_to_delete: #python set()
#delete this element node
else:
if child.text in products_dict_to_update:
#update this element node
else:
print child.text
element.clear()
注意:-我想一次掃描XML文件來完成所有這4個任務
問題
1)我可以一次掃描文件來實現所有這些功能嗎?
2)如果是,如何刪除和更新我正在處理的元素節點?
3)我應該改用tree.xpath()嗎? 如果是,則將為1.5 GB的文件消耗多少內存,或者它與iterparse()的工作方式相同
我對python不太有經驗。 我來自Java背景。
您不能就地編輯XML文件。 您必須將輸出寫入新的(臨時)文件,然后用新文件替換原始文件。
因此,基本算法是:
要回答補充問題:您需要認識到XML文件是一個(長)字符串。 如果要插入一個字符,則必須將其他所有字符都洗牌; 如果要刪除一個字符,則必須將其他所有字符都洗掉。 您不能使用文件來執行此操作; 您不能只是從文件中間刪除字符。
如果您有數百萬個元素(這是一個實際的問題,而不是一個類的練習),那么您需要使用數據庫。 當有人說“數據庫”時,我首先想到了SQLite,但是正如Charles Duffy在下面指出的那樣,如果您已經有了XML,那么XQuery數據庫可能是一個更好的起點。 有關某些開源實現,請參見BaseX或eXist。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.