2015-02-10 1 views
1

Я совершенно новичок в Python и использует его в последнее время, чтобы попытаться разобрать большой иш XML-файла 700 МБ.Python удаления элементов из больших XML-файла с XML iterparse

Осмотревшись, которые я пытался использовать iterparse методы, чтобы удалить элемент с именем Revision_History для XML, так как мы больше не нужна эта информация.

Я через пару вариаций с этим сценарием, так что это может быть ужасно неправильно, в настоящее время. Кажется, что это нормально для первых двух абсорбций. Однако он перестает работать и не находит никаких дополнительных тегов revision_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() 

Любые советы очень ценятся!

Адам

+0

выглядит как «if event == ..» имеет неправильный отступ, так что в вашем цикле ничего не работает, есть ли у вас синтаксические ошибки для этого форматирования? – artemdevel

+0

artemdevel, это ошибка от меня вставив его в поперечнике. – ADWALSH

ответ

1

Попробуйте использовать 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) 

В-третьих, в зависимости от того, сколько оперативной памяти вы хотите использовать, вы можете попробовать использовать 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] или аналогичный.

Есть много лучших способов решить эту проблему, я уверен.

Смежные вопросы