Удаление / перестановка / добавление в очень большие файлы TSV Python
У меня есть очень большой файл TSV (1,2 ГБ, 5 столбцов, 38 м строк). Я хочу удалить столбец, добавить столбец идентификаторов (от 1 до 38 м) и изменить порядок столбцов. Как я могу сделать это без использования смешного количества памяти?
Выбор языка - Python, хотя и открыт для других решений.
3 ответа
Вы можете читать, манипулировать и писать по одной строке за раз. Не загружая весь файл в память, это будет иметь очень низкую сигнатуру памяти.
import csv
with open(fileinpath, 'rb') as fin, open(fileoutpath, 'wb') as fout:
freader = csv.reader(fin, delimiter = '\t')
fwriter = csv.writer(fout, delimiter = '\t')
idx = 1
for line in freader:
line[4], line[0] = line[0], line[4] #switches position between first and last column
del line[3] #delete fourth column
line.insert(0, idx)
fwriter.writerow(line)
idx += 1
(Это написано в python2.7, и удаляет четвертый столбец для примера)
Что касается перестановки порядка - я предполагаю, что это порядок столбцов - это можно сделать в части манипуляции. Есть пример переключения порядка первого и последнего столбца.
Ответ в огромной степени зависит от того, сколько контекста требуется, нужно переписать строки и определить новый порядок.
Если можно переписать отдельные строки без учета контекста (зависит от того, как получен идентификационный номер), вы можете использовать csv
модуль для построчного чтения файла, как иллюстрирует @Tal Kremerman, и построчный вывод его в том же порядке. Если вы можете определить правильный порядок строк в это время, то вы можете добавить дополнительное поле, указывающее новый порядок, в котором они должны появляться.
Затем вы можете сделать второй проход, чтобы отсортировать / переставить строки в правильном порядке. В последнее время появилось много тем о том, "Как сортировать огромные файлы с помощью Python", например, Как сортировать огромные файлы с помощью Python? Я думаю, что Тал Кремерман прав, что ОП хочет переставлять только столбцы, а не строки
Ты можешь использовать awk
чтобы сделать это, я не скажу, что 1,2 ГБ займет огромное количество памяти.
если хочешь удалить с3
awk -F"\t" 'BEGIN{OFS="\t"}{print $1,$2,$4,$5,NR}' input.txt > output.txt
необработанный вывод c1 c2 c4 c5 columnId(от 1 до 38 м)
$ 1 - столбец1, $ 2 - столбец2 и т. Д. NR - номер строки.
если вы хотите изменить порядок, просто измените порядок в $1,$2,$4,$5 и NR,