使用Python对文本文件进行排序

时间:2015-02-04 16:10:50

标签: python file sorting text

好的我有一个这样的文本文件:

Data1A
Data1B

Data2A
Data2B

数据1A和1B之间没有空格,而2A和2B之间没有空格,但是在1和2之间。

是否可以使用Python来读取此文本文件,并像这样排列数据

Data1A Data1B
Data2A Data2B

最好我想阅读它,对它进行排序并以CSV格式导出,但是,即使只是将它排序,因此数据部分A和B并排也是一个很大的帮助。

如果它可行,你能帮助我找到足够的教程或实现它的东西吗?

3 个答案:

答案 0 :(得分:0)

假设这是写在文件in.txt

with open("fin.txt","r") as fin:
    a=[]
    for line in fin:
         a.append(line)
b=sorted(a)
aSorted=[[b[i+1][:-1] for i in range(len(b)-1)] ]

无论输入的读取顺序如何,这都会为您提供排序列表。有几种输出数据的方法。取决于您希望代码的一般程度。一个非常简单的选择是:

with open("fou.csv","w") as fou:
    for i in range(len(aSorted)//2):
         fou.write("%s,\t%s\n" % (aSorted[0+i],aSorted[1+i]))

答案 1 :(得分:0)

查看itertools.groupby

import itertools as it

with open(fn_in, 'r') as fi, open(fn_out, 'w') as fo:
    for b, lines in it.groupby(fi, key=str.strip):
        if b:
            fo.write(' '.join(line.strip() for line in lines) + '\n')

这适用于大型文件,因为它可以逐行排列。

它根据str.strip(换行 - 剥离线)的结果对行进行分组,对于非空行为b = True,对于空行为b = False。在lines中,您将获得属于该组的行生成器。忽略b = False,这通常是一个单独的分隔符空行,并加入lines b = True

答案 2 :(得分:0)

好吧,假设文件不是太大而且可以在内存中读取,下面的代码可以完成这项工作: -

import re
reference_dict = {}
with open("input", "r") as f:
    for line in f.readlines():
        line = line.strip('\n')
        regex = re.compile("^Data(?P<row>[0-9]*).*$")
        search_result = regex.search(line)
        if search_result:
            row = search_result.groupdict()['row']
            if row in reference_dict:
                reference_dict[row].append(line)
            else:
                reference_dict[row] = [line]

print reference_dict  #prints {'1': ['Data1A', 'Data1B'], '2': ['Data2A', 'Data2B']}

您可以根据需要进行分组。它可以以您需要的任何方式使用。代码是自我解释的。如果您需要更多解释,请评论?