gpt4 book ai didi

python - 使用生成器分块读取 CSV 文件

转载 作者:行者123 更新时间:2023-12-01 08:47:59 27 4
gpt4 key购买 nike

我有一个大的 csv 文件需要处理,它是这样完成的(非常简单):

import csv
from csv import excel

def _get_dialect():
class CustomDialect(excel):
delimiter = ','
return CustomDialect()

class DictIter:
def __init__(self):
self.reader = csv.DictReader(open('test.csv'),
fieldnames=['col1', 'col2'],
dialect=_get_dialect())

def __iter__(self):
return self

def __next__(self):
return self.reader.__next__()

items = DictIter()
for item in items:
print(item)

有更好的方法可以做到这一点,但这就是我现在所拥有的。现在我想将处理分成多个 block ,并找到了这个适合我的简单解决方案:

def gen_chunks(reader, chunksize=500):
chunk = []
for i, line in enumerate(reader):
if (i % chunksize == 0 and i > 0):
yield chunk
del chunk[:]
chunk.append(line)
yield chunk

但是我缺乏一些生成器知识来将这两段代码组合在一起。基本上我想要这样的东西:

import csv
from csv import excel

def gen_chunks(reader, chunksize=500):
chunk = []
for i, line in enumerate(reader):
if (i % chunksize == 0 and i > 0):
yield chunk
del chunk[:]
chunk.append(line)
yield chunk

def _get_dialect():
class CustomDialect(excel):
delimiter = ','
return CustomDialect()

class DictIter:
def __init__(self):
self.reader = csv.DictReader(open('test.csv'),
fieldnames=['col1', 'col2'],
dialect=_get_dialect())

def __iter__(self):
return self

def __next__(self):
for chunk in gen_chunks(self.reader):
for item in chunk:
yield item

items = DictIter()
for item in items:
print(item)

这可能是有点笨拙的方法,但我想通过对当前结构进行最小的更改来实现拆分处理。我想要实现的是将当前实现保留为迭代器类,但一次处理一个 block ,并在完成前一个 block 后生成下一个 block 。

最佳答案

您的解决方案看起来过于复杂:

import csv

with open('test.csv',newline='') as f:
reader = csv.DictReader(f,fieldnames=['col1', 'col2'])
for item in reader:
print(item)

您的分块仍然一次返回一项。 excel 方言的默认分隔符是逗号,excel 是默认方言。

注意 newline='' 是打开传递给 csv 读取器或写入器对象的文件的记录方式。

如果您确实有分块的原因(多处理?),您应该说明这一点,并在失败时显示该尝试。

关于python - 使用生成器分块读取 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235481/

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