gpt4 book ai didi

python - 从大 csv 创建字典列表

转载 作者:行者123 更新时间:2023-11-30 23:03:58 25 4
gpt4 key购买 nike

我有一个非常大的 csv 文件(10 GB),我想阅读它并创建一个字典列表,其中每个字典代表 csv 中的一行。类似的东西

[{'value1': '20150302', 'value2': '20150225','value3': '5', 'IS_SHOP': '1', 'value4': '0', 'value5': 'GA321D01H-K12'},
{'value1': '20150302', 'value2': '20150225', 'value3': '1', 'value4': '0', 'value5': '1', 'value6': 'GA321D01H-K12'}]

我正在尝试使用生成器来实现它,以避免任何内存问题,我当前的代码如下:

def csv_reader():
with open('export.csv') as f:
reader = csv.DictReader(f)
for row in reader:
yield {key: value for key, value in row.items()}

generator = csv_reader()
list = []
for i in generator:
list.append(i)

问题是基本上它会耗尽内存,因为列表变得太大并且进程被终止。有没有办法以有效的方式实现相同的结果(字典列表)?我对生成器/产量非常陌生,所以我什至不知道我是否正确使用它。

我还尝试使用 pypy 的虚拟环境,但内存无论如何都会损坏(不过稍后)。

基本上,我想要一个字典列表的原因是我想尝试使用 fastavro 将 csv 转换为 avro 格式,因此任何关于如何使用 fastavro ( https://pypi.python.org/pypi/fastavro ) 而不创建字典列表的提示将不胜感激

最佳答案

如果目标是从 csv 进行转换至avro ,没有理由存储输入值的完整列表。这违背了使用发电机的全部目的。看起来,在设置模式之后, fastavro 's writer is designed to take an iterable and write it out one record at a time ,所以你可以直接将它传递给生成器。例如,您的代码将简单地省略创建 list 的步骤。 (旁注:命名变量 list 是一个坏主意,因为它会隐藏/踩踏内置名称 list ),然后直接编写生成器:

from fastavro import writer

def csv_reader():
with open('export.csv') as f:
reader = csv.DictReader(f)
for row in reader:
yield row

# If this is Python 3.3+, you could simplify further to just:
with open('export.csv') as f:
yield from csv.DictReader(f)

# schema could be from the keys of the first row which gets manually written
# or you can provide an explicit schema with documentation for each field
schema = {...}

with open('export.avro', 'wb') as out:
writer(out, schema, csv_reader())

然后生成器一次生成一行,并且 writer一次写入一行。输入行在写入后将被丢弃,因此内存使用量保持在最低限度。

如果您需要修改行,则需要修改 rowcsv_reader之前的发电机yield -ing它。

关于python - 从大 csv 创建字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33919669/

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