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

标签 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(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/

相关文章:

python - 如何定义接受类型参数的 Python 类

javascript - Python:如何访问网页,单击特定链接并将其中的数据复制到文本文件?

c# - 对数组中的 x/n 元素进行排序的最有效方法 - .NET

python - 与 SKlearn 精确召回曲线计算的混淆

python - 如何按数字从高到低排序

algorithm - 交换排序和冒泡排序有什么区别?它们相同吗?

android - 对 RecyclerView 的项目进行排序 - Kotlin 代码

Python设置不存在的数组的值默认为0

javascript - 我可以在 Rails 表单上下载带有 `remote: true` 的 CSV 文件吗?

python - 从特定目录在 python 中打开 csv 文件时出错