【问题标题】:70 GB ALTO Xml file parsing70 GB ALTO Xml 文件解析
【发布时间】:2020-07-15 19:20:36
【问题描述】:

我无法将 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 函数。

【问题讨论】:

  • 如果文件的格式真的那么简单,您似乎可以手动将其分成更小的“块”,每个块都足够小以进行处理。每一个的 csv 输出可以附加到 csv 输出文件的末尾。
  • @martineau 因为它是一个 70 Gb 的文件,不幸的是,由于它有更多的列并且我什至不知道有多少行,所以无法手动划分文件。
  • 如果每一行都在一行上,这似乎是可行的(不管每一行有多少列)。

标签: python xml csv dataframe elementtree


【解决方案1】:

我会使用允许分块处理 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

【讨论】:

  • 这正是我一直在寻找的,它工作得很好。谢谢!
猜你喜欢
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 2014-12-06
  • 1970-01-01
  • 2020-06-16
  • 2016-11-26
  • 2011-11-20
相关资源
最近更新 更多