1

我有一个大的(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),我预计这种方法可能不是最快的。

4

1 回答 1

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 应该在程序退出时清理临时文件......

于 2013-07-11T22:01:39.843 回答