我有一个大的(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),我预计这种方法可能不是最快的。
答案 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应该在程序退出时清理临时文件...