我有一个大的 (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(3000 万路径)只是长度 <= 10),我预计这种方法可能不是最快的。
最佳答案
我会根据长度将它们拆分成单独的文件,然后再将它们重新组合在一起 - 类似于:
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 应该在程序退出时清理临时文件...
关于python - 按每行中的列数对 csv 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604035/