Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按每行中的列数对csv进行排序_Python_Sorting_Csv - Fatal编程技术网

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

Python 按每行中的列数对csv进行排序,python,sorting,csv,Python,Sorting,Csv,我有一个大的(2.2GB)文本分隔文件,其中包含化学路径,当我想从化学a到化学B时,我会搜索这些路径。我想知道是否有人知道一种方法(最好是python)可以按行中的列数对文件进行排序 例如: CSV: 应排序为: H I E F G A B C D J K L M N 我一直在考虑制作一个包含行长和行数的哈希表,但随着csv文件越来越大:(我们在一个化学网络上运行最长路径,2.2gb(30mil路径)仅为长度,我会根据长度将它们拆分为单独的文件,然后再将它们重新连接在一起-类似于: from

我有一个大的(2.2GB)文本分隔文件,其中包含化学路径,当我想从化学a到化学B时,我会搜索这些路径。我想知道是否有人知道一种方法(最好是python)可以按行中的列数对文件进行排序

例如:

CSV:

应排序为:

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

我一直在考虑制作一个包含行长和行数的哈希表,但随着csv文件越来越大:(我们在一个化学网络上运行最长路径,2.2gb(30mil路径)仅为长度,我会根据长度将它们拆分为单独的文件,然后再将它们重新连接在一起-类似于:

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

我会根据长度将它们拆分为单独的文件,然后再将它们重新连接在一起-类似于:

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

我会建立一个索引并进行排序。例如,对于化学路径文件中的每一行,在
(长度,指针指向行)
的索引中创建一个元组。长度很简单,因为您只需执行
len(row.split())
。可以通过
f.tell()
或类似的方法来指向该行。对索引进行排序。排序后,使用它从化学路径文件中按顺序抓取行,您可以将其写入新文件。编辑:可能会有帮助。我的第一反应是将此数据放入数据库,而不是尝试强制使用CSV(尽管您可能已经从数据库中读取了数据!)您将享受到数据库的好处,并能够在将来根据需要使用Python+SQL进行更多类型的数据分析。我将构建一个索引并对其进行排序。例如,对于化学路径文件中的每一行,在
(长度,指向行的指针)
。长度很简单,因为您只需执行
len(row.split())
。指向行的指针可以通过
f.tell()完成
或类似内容。对索引进行排序。排序后,使用它按顺序从化学路径文件中提取行,您可以将其写入新文件。编辑:可能会有帮助。我的第一反应是将此数据放入数据库,而不是尝试强制使用CSV(尽管您可能已经从数据库中读取了数据!)。您将获得数据库的好处,并能够在将来需要时使用Python+SQL进行更多类型的数据分析。非常pythonic,对于新手来说不是很可读。我认为应该对此进行评论。@btoueg对其稍加注释-如果您认为它需要什么,请告诉我。非常感谢:)@JonClements如果你想知道你的算法做得有多好,它花了2小时36分钟对30000000行进行排序!@Darkstarone这似乎很可怜-在一个慢速磁盘上可能需要5-10分钟,但2个半小时?听起来不太对…非常像蟒蛇,对新来的人来说不是很可读。我认为应该对此进行评论。@btoueg-ann稍微旋转一下-如果您认为它需要什么,请告诉我,这正是我所需要的!非常感谢:)@JonClements如果你想知道你的算法做得有多好,它花了2小时36分钟对30000000行进行排序!@Darkstarone这似乎很可怜-在一个慢磁盘上可能需要5-10分钟,但2个半小时?听起来不太对。。。