删除/重新排列/添加非常大的tsv文件Python

时间:2014-06-18 20:36:05

标签: python tsv

我有一个非常大的tsv文件(1.2GB,5列,38米行)。我想删除一列,添加一列ID(1到38米),然后重新排列列顺序。如果不使用荒谬的内存,我怎么能这样做呢?

选择的语言是Python,但对其他解决方案持开放态度。

3 个答案:

答案 0 :(得分:2)

您可以一次读取,操作和写入一行。不将整个文件加载到内存中,这将具有非常低的内存签名。

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编写的,删除第四列的例子)

关于重新排列顺序 - 我假设它是列的顺序 - 这可以在操作部分中完成。这是一个切换第一列和最后一列的顺序的例子。

答案 1 :(得分:1)

您可以使用awk来执行此操作,我不会说1.2GB会占用大量内存。

如果你想删除c3

awk -F"\t" 'BEGIN{OFS="\t"}{print $1,$2,$4,$5,NR}' input.txt > output.txt

原始输出是 c1 c2 c4 c5 columnId(1至38m)

$ 1是coloumn1,$ 2是column2,依此类推。 NR是行数。

如果您想重新排列,只需更改$ 1,$ 2,$ 4,$ 5和NR的订单,

答案 2 :(得分:1)

答案很大程度上取决于需要多少上下文来重写行并确定新的顺序。

如果可以在不考虑上下文的​​情况下重写各行(取决于ID号的派生方式),那么您可以使用csv模块来读取@Tal Kremerman说明的逐行文件,并以相同的顺序逐行写出。如果您此时可以确定行的正确顺序,那么您可以添加一个额外的字段,指示它们应该出现的新顺序。

然后你可以做第二遍来将线排序/重新排列成正确的顺序。最近有许多线程"如何使用Python"对大型文件进行排序,例如How to sort huge files with Python? 我认为Tal Kremerman是正确的,OP只想重新排列列,而不是行