Основная проблема - чтение всего набора данных в память.Как правило, с очень большим файлом мне нужно читать файл построчно, потому что он не помещается в памяти.Поэтому я разделяю файл, и только тогда я могу работать с частями (либо с Python / pandas, R или Stata, которые загружают весь набор данных в память).
Чтобы разбить файл, я написал быCSV ридер с нуля.Не слишком сложно, если вам не нужно обрабатывать разделители внутри строк в кавычках (иначе это не намного сложнее с регулярным выражением ).Вероятно, возможно с меньшим количеством кода с помощью встроенного модуля csv (признаюсь, я никогда не использовал его).
Следующее разбивает файл в соответствии со значениями переменной.Также возможно адаптировать код для разделения на фиксированное количество строк, для фильтрации, добавления или удаления переменных ...
import sys
def main(arg):
if len(arg) != 3:
print("csvsplit infile outfile variable")
return
input_name = arg[0]
output_name = arg[1]
split_var = arg[2]
sep = ","
outfiles = {}
with open(input_name) as f:
var = f.readline().rstrip("\r\n").split(sep)
ivar = {name: i for i, name in enumerate(var)}
ikey = ivar[split_var]
for line in f:
v = line.rstrip("\r\n").split(sep)
key = v[ikey]
if key not in outfiles:
outfiles[key] = open("%s_%s.csv" % (output_name, key), "wt")
outfiles[key].write(sep.join(var) + "\n")
outfiles[key].write(line)
for key, outfile in outfiles.items():
outfile.close()
main(sys.argv[1:])