Удаление / перестановка / добавление в очень большие файлы 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,

Другие вопросы по тегам