按每行中的列数对csv进行排序

时间:2013-07-11 21:43:31

标签: python sorting csv

我有一个大的(2.2GB)文本分隔文件,当我想从化学品A转到化学品B时,它保存我搜索的化学路径。我想知道是否有人知道某种方式(最好是在python中)我可以按行中的列数对文件进行排序吗?

示例:

CSV:

A B C D
E F G
H I
J K L M N

应排序:

H I
E F G
A B C D
J K L M N 

我一直在考虑制作行长度和行的哈希表,但随着csv文件变大:(我们在化学网络上运行最长的路径,而2.2gb(30mil路径)只是长度< = 10),我预计这种方法可能不是最快的。

1 个答案:

答案 0 :(得分:5)

我会根据长度将它们拆分成单独的文件,然后将它们重新组合在一起 - 例如:

from tempfile import TemporaryFile
from itertools import chain

保留文件长度 - >输出文件的参考字典。如果文件已经打开,则写入文件或创建新的临时文件。

output = {}
with open('input') as fin:
    for line in fin:
        length = len(line.split())
        output.setdefault(length, TemporaryFile()).write(line)

正如Steven Rumbalski指出的那样,这也可以通过defaultdict完成:

from collections import defaultdict
output = defaultdict(TemporaryFile)
...
output[length].write(line)

临时文件都将指向文件的末尾。将它们重置为开头,以便在阅读它们时我们再次获取数据......

for fh in output.values():
    fh.seek(0)

以逐渐增加的长度顺序从每个文件中获取行...并将它们全部写入最终输出文件。

with open('output', 'w') as fout:
    fout.writelines(chain.from_iterable(v for k,v in sorted(output.iteritems())))

然后Python应该在程序退出时清理临时文件...