Анализ файла ALTO Xml 70 ГБ - PullRequest
       7

Анализ файла ALTO Xml 70 ГБ

0 голосов
/ 03 апреля 2020

У меня проблемы с анализом 70 ГБ XML файла в CSV.

Вот так выглядит XML:

<?xml version="1.0" encoding="utf-8"?>
<File>
  <row Id="1" Name="tanu" Count="289949" />
  <row Id="2" Name="daniel" Count="863524" />
  <row Id="3" Name="ricky" Count="1909662"/>
</File>

Поскольку это такой большой файл, я не может прочитать весь файл за один go, так как это убивает ядро. Сначала я хочу перебрать некоторое количество строк и записать их в файл CSV.

Я использую следующий код:

import xml.etree.ElementTree as et
import pandas as pd

path = 'file path'
root = et.parse(path)
rows = root.findall('.//row')
column_names = ['Id','Name','Count']
xml_data = [[row.get(col) for col in column_names]
data = pd.DataFrame(xml_data,columns=column_names)
data.to_csv ('File.csv', index = False, header = True)

Я был бы очень признателен, если бы кто-нибудь мог сказать мне, как читать XML кусками и записывать в CSV. Я не могу правильно запустить функцию .iterator в приведенном выше коде.

1 Ответ

1 голос
/ 03 апреля 2020

Я бы использовал парсер, который позволяет обрабатывать файл xml порциями, например парсер экспатов. Единственная проблема заключается в том, что вы должны знать с начала столбцы, которые вы хотите записать в CSV-файл. Код может быть:

with open('file path', 'rb') as fdin, open('File.csv', 'w', newline='') as fdout:
    writer = csv.DictWriter(fdout, ['Id', 'Name', 'Count'],
                            extrasaction='ignore')   # any additional field will be ignored
    writer.writeheader()

    def start_elt(name, attrs):
        if name == 'row':
            writer.writerow(attrs)

    parser = xml.parsers.expat.ParserCreate()
    parser.StartElementHandler = start_elt
    parser.ParseFile(fdin)
    print(fdout.getvalue())

С файлом примера я получаю:

Id,Name,Count
1,tanu,289949
2,daniel,863524
3,ricky,1909662
...