Как разделить XML-файл простым способом в Python? - PullRequest
5 голосов
/ 07 сентября 2011

У меня есть код Python для разбора XML-файла как подробно здесь . Я понимаю, что XML-файлы печально известны тем, что занимают системные ресурсы при манипуляциях в памяти. Мое решение работает для небольших файлов XML (скажем, 200 КБ, и у меня есть файл 340 МБ).

Я начал исследовать реализацию StAX (pull parser), но я работаю в сжатые сроки и ищу более простой подход к этой задаче.

Я понимаю создание небольших кусков файлов, но как мне извлечь нужные элементы, каждый раз выводя теги main / header?

Например, это схема:

<?xml version="1.0" ?>
<!--Sample XML Document-->
<bookstore>
    <book Id="1">
      ....
      ....
    </book> 
    <book Id="2">
      ....
      ....
    </book> 
    <book Id="3">
      ....
      ....
    </book> 
    ....
    ....
    ....
    <book Id="n">
      ....
      ....
    </book> 
</bookstore>

Как мне создать новые XML-файлы с данными заголовка для каждых 1000 элементов книги? Для конкретного примера кода и набора данных, пожалуйста, обратитесь к моему другому вопросу здесь . Большое спасибо.

Все, что я хочу сделать, это избегать одновременной загрузки набора данных в память. Можем ли мы проанализировать XML-файл в потоковом режиме? Думал ли я в правильном направлении?

p.s: Моя ситуация похожа на вопрос, заданный в 2009 году. Я опубликую ответ здесь, когда найду более простое решение для моей проблемы. Ваш отзыв приветствуется.

Ответы [ 2 ]

8 голосов
/ 07 сентября 2011

Вы можете постепенно разбирать ваш большой XML-файл :

from xml.etree.cElementTree import iterparse

# get an iterable and turn it into an iterator
context = iter(iterparse("path/to/big.xml", events=("start", "end")))

# get the root element
event, root = next(context)
assert event == "start"

for event, elem in context:
    if event == "end" and elem.tag == "book":
       # ... process book elements ...
       root.clear()
2 голосов
/ 07 сентября 2011

Вы можете использовать elementtree.iterparse и сбросить каждый тег книги после его обработки.

...