我有一个大的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)
有更好的方法来做,但这就是我现在所拥有的。 现在,我想把处理分成块,找到一个简单的解决方案,它应该对我有用:
^{pr2}$不过,我缺乏一些生成器知识,无法将这两段代码组合在一起。基本上我想要这样的东西:
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)
这可能有点笨拙,但我希望在对当前结构进行最小更改的情况下实现拆分处理。我试图实现的是让当前实现保留迭代器类,但一次处理一个块,并在完成前一个块后生成下一个块。在
您的解决方案看起来过于复杂:
你的分块仍然一次返回一个项目。
excel
方言的默认分隔符是逗号,excel
是默认方言。在注意
newline=''
是打开传递给csv
读写器对象的文件的方法。在如果你真的有理由分块(多处理?)你应该说明这一点,如果不成功的话,你应该展示一下。在
相关问题 更多 >
编程相关推荐