Разделение большого XML-файла в Python

Устранена. Функция вероятности массы гамма-функции реализована в numpy.random иначе, чем в моем учебнике.

Я получил правильное среднее значение, установив параметр 'scale' в теле get_samples_from_gamma_dist () в 1 / lamb:

def get_samples_from_gamma_dist( num_of_samples, size_of_samples, alpha, lamb ):
'''
Returns table with ( num_of_samples ) rows and ( size_of_samples ) columns.
Cells in the table are i.i.d sample values from numpy's gamma function
with shape parameter ( alpha ) and scale parameter ( 1 / lamb ).
'''
return pd.DataFrame( 
        data = gamma( 
                shape = alpha, 
                scale = 1 / lamb, 
                size = 
                    ( 
                        num_of_samples, 
                        size_of_samples 
                    )
            )
        )
9
задан 25 January 2009 в 00:22
поделиться

5 ответов

Существует два распространенных способа обработать данные XML.

Каждого называют DOM, который обозначает Объектную модель документа. Этот стиль парсинга XML, вероятно, что Вы видели при рассмотрении документации, потому что это читает весь XML в память для создания объектной модели.

Второе называют SAX, который является методом потоковой передачи. Синтаксический анализатор начинает читать XML и отправляет сигналы в Ваш код об определенных событиях, например, когда новый тег запуска найден.

Таким образом, SAX ясно, в чем Вы нуждаетесь для своей ситуации. Синтаксические анализаторы саксофона могут быть найдены в библиотеке Python под xml.sax и xml.parsers.expat.

9
ответ дан 4 December 2019 в 09:38
поделиться

Я имел успех с cElementTree.iterparse методом, чтобы сделать подобную задачу.

У меня был большой xml документ с повторными 'записями' с тегом 'resFrame', и я хотел отфильтровать записи для определенного идентификатора. Вот код, который я использовал для него:

исходный документ имел эту структуру

<snapDoc>
  <bucket>....</bucket>
  <bucket>....</bucket>
  <bucket>....</bucket>
  ...
  <resFrame><id>234234</id>.....</resFrame>
  <frame><id>344234</id>.....</frame>
  <resFrame>...</resFrame>
  <frame>...</frame>
</snapDoc>

Я использовал следующий сценарий для создания меньшего документа, который имел ту же структуру, записи блока и только resFrame записи с определенным идентификатором.

#!/usr/bin/env python2.6

import xml.etree.cElementTree as cElementTree
start = '''<?xml version="1.0" encoding="UTF-8"?>
<snapDoc>'''

def main():
    print start
    context = cElementTree.iterparse('snap.xml', events=("start", "end"))
    context = iter(context)
    event, root = context.next() # get the root element of the XML doc

    for event, elem in context:
        if event == "end":
            if elem.tag == 'bucket': # i want to write out all <bucket> entries
               elem.tail = None  
               print cElementTree.tostring( elem )
            if elem.tag == 'resFrame':
                if elem.find("id").text == ":4:39644:482:-1:1": # i only want to write out resFrame entries with this id
                    elem.tail = None
                    print cElementTree.tostring( elem )
            if elem.tag in ['bucket', 'frame', 'resFrame']:
                root.clear()  # when done parsing a section clear the tree to safe memory
    print "</snapDoc>"

main()
6
ответ дан 4 December 2019 в 09:38
поделиться

Как случайный! Will Larson просто сделал хорошее сообщение об Обработке Очень Большого CSV и XML-файла в Python.

Основная еда на дом, кажется, для использования xml.sax модуль, как Van упомянул, и сделать некоторые макрофункции к краткому обзору далеко деталями SAX низкого уровня API.

1
ответ дан 4 December 2019 в 09:38
поделиться

Вы могли бы рассмотреть использование функции ElementTree iterparse для этой ситуации.

6
ответ дан 4 December 2019 в 09:38
поделиться

Это старая, но очень хорошая статья из колонки Uche Ogbuji, также очень хорошей Python и XMl. Он охватывает ваш точный вопрос и использует стандартный модуль sax библиотеки, как и в другом ответе. Декомпозиция, обработка, перекомпоновка

0
ответ дан 4 December 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: