Когда вы читаете ввод с параметрами по умолчанию, я предполагаю, что у вас есть запятая (,
) для разделителя и одна строка заголовка.ИМХО панды для этого здесь не требуется.Достаточно прочитать файл по одной строке за раз и записать его в CSV-файл, соответствующий дате.
Предостережения: добавьте заголовок в каждый выходной CSV-файл и создайте новый выходной файл для каждой новой даты.,collections.defaultdict
с пользовательской функцией по умолчанию достаточно для удовлетворения этих требований 2.
Следующий код читает входной CSV-файл с именем "out_1.csv"
и записывает его содержимое в группу файлов с именем out_2018-03-26.csv
датадата всех строк в выходном файле:
with open("out_1.csv") as fdin:
def get_defaults():
"""returns a pair (csv_writer, file_object) for date dat initialized with header"""
filename = 'out{}.csv'.format(dat)
fd = open(filename, "w", newline='')
fd.write(header)
return (csv.writer(fd), fd)
outfiles = collections.defaultdict(get_defaults)
rd = csv.reader(fdin)
header = next(fdin) # store the header to later initialize output files
for row in rd:
dat = row[1][:10] # extract the date
wr = outfiles[dat][0]
wr.writerow(row) # and write the row to the appropriate output file
# close the output files
for i in outfiles:
outfile[i][1].close()
После второго размышления над этим кодом может остаться слишком много открытых файлов.Вот улучшенная версия, которая хранит открытые файлы только в течение 3 самых последних встреч (проверено):
with open("out_1.csv") as fdin:
cache = collections.deque()
seen = set()
def get_defaults():
"""returns a pair (csv_writer, file_object) for date dat initialized with header"""
filename = 'out{}.csv'.format(dat)
fd = open(filename, 'a' if dat in seen else 'w', newline='')
if 0 == fd.tell(): # file is currently empty: write header
fd.write(header)
ret = (csv.writer(fd), fd)
cache.append(dat)
seen.add(dat)
if len(cache) > 3: # only keep 3 open files
old = cache.popleft()
print("Closing", old)
outfiles[old][1].close()
del outfiles[old]
return ret
outfiles = collections.defaultdict(get_defaults)
rd = csv.reader(fdin)
header = next(fdin) # store the header to later initialize output files
for row in rd:
dat = row[1][:10] # extract the date
wr = outfiles[dat][0]
wr.writerow(row) # and write the row to the appropriate output file
# close the currently opened output files
for i in outfiles:
outfiles[i][1].close()