70 GB ALTO Xml 文件解析

70 GB ALTO Xml file parsing

我无法将 70 GB 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>

因为它太大了,我无法一次读取整个文件,因为它会杀死内核。我想先遍历一些行并将它们写入 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 正常运行。

我会使用允许分块处理 xml 文件的解析器,例如 expat 解析器。唯一的问题是您应该从头开始 了解您要写入 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