gpt4 book ai didi

python - 解析多个大型 XML 文件并写入 CSV

转载 作者:太空宇宙 更新时间:2023-11-04 09:25:34 25 4
gpt4 key购买 nike

我有大约 1000 个 XML 文件,每个文件大小为 250 MB。我需要从中提取一些数据并写入 CSV。 不能没有任何重复条目。

我的系统配备 4GB RAM 和 AMD A8 处理器。

我已经在这里浏览了一些以前的帖子,但它们似乎没有回答我的问题。

我已经用 Python 编写了代码并在示例 XML 上对其进行了测试,并且运行良好。

但是,当我在所有文件上使用它并且不得不中途终止进程时,它非常慢(每个文件将近 15 分钟)。

什么是加速该过程的最佳解决方案?

这是代码

path='data/*.xml'
t=[]
for fname in glob.glob(path):
print('Parsing ',fname)
tree=ET.parse(fname)
root=tree.getroot()
x=root.findall('//Article/AuthorList//Author')
for child in x:
try:
lastName=child.find('LastName').text
except AttributeError:
lastName=''
try:
foreName=child.find('ForeName').text
except AttributeError:
foreName=''
t.append((lastName,foreName))
print('Parsed ',fname)

t=set(t)

我想要最快的方法来获取条目没有任何重复值。(也许存储在一些数据库中而不是变量 t,将每个条目存储在数据库中会由于更多的空闲 RAM 而加速吗?-无论我需要什么方法来指导它)

最佳答案

不是将结果写入 Python 列表,而是创建一个具有 UNIQUE 约束的数据库表,并将所有结果写入该表。完成所有写入后,将数据库表转储为 csv。

如果您不希望有任何额外的依赖项来写入数据库,我建议您使用 sqlite3,因为它在任何最新的 Python 安装中都是开箱即用的。

下面是一些开始的代码:

import sqlite3
conn = sqlite3.connect('large_xml.db') # db will be created
cur = conn.cursor()
crt = "CREATE TABLE foo(fname VARCHAR(20), lname VARCHAR(20), UNIQUE(fname, lname))"
cur.execute(crt)
conn.commit()

path='data/*.xml'
for fname in glob.glob(path):
print('Parsing ',fname)
tree=ET.parse(fname)
root=tree.getroot()
x=root.findall('//Article/AuthorList//Author')
count = 0
for child in x:
try:
lastName=child.find('LastName').text
except AttributeError:
lastName=''
try:
foreName=child.find('ForeName').text
except AttributeError:
foreName=''
cur.execute("INSERT OR IGNORE INTO foo(fname, lname) VALUES(?, ?)", (foreName, lastName))
count += 1
if count > 3000: # commit every 3000 entries, you can tune this
count = 0
conn.commit()

print('Parsed ',fname)

填充数据库后,将其转储到 csv,如下所示:

sqlite3 -header -csv large_xml.db "select * from foo;" > dump.csv

另外,尝试更快的解析方式。此外,如果 .text 属性在大多数情况下可用,以下可能比异常处理更快:

lastName = getattr(child.find('LastName'), 'text', '')

关于python - 解析多个大型 XML 文件并写入 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57831594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com