У меня есть большой 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)
Это может быть несколько неуклюжий подход, но я хочу реализовать обработку разбиения с минимальными изменениями в текущей структуре. То, чего я пытаюсь добиться, - это оставить текущую реализацию с классом итератора, но обрабатывать по одному куску за раз и получить следующий, когда я закончу с предыдущим.