【发布时间】:2019-04-13 14:22:41
【问题描述】:
我有一个需要处理的大 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)
有更好的方法来做到这一点,但这就是我现在所拥有的。 现在我想将处理拆分成块,并找到了适合我的简单解决方案:
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)
这可能有点笨拙,但我想在对当前结构进行最小更改的情况下实现拆分处理。我想要实现的是将当前实现保留为迭代器类,但一次处理一个块,并在完成前一个块时产生下一个块。
【问题讨论】:
标签: python python-3.x csv iterator generator