如何在Python中的多个文件中逐行排序?

时间:2016-11-01 08:35:48

标签: python list sequence

我有一些文本文件,我想逐个文件地逐行读取,并在Python中对一个文件进行排序和写入,例如:

file 1:
C
D
E

file 2:
1
2
3
4

file 3:
#
$
*

File 4,.......

结果应该像一个文件中的这个序列一样:

C
1
#
D
2
$
E
3
*
C
4
#
D
1
#

2 个答案:

答案 0 :(得分:1)

您可以在文件上使用迭代器列表。然后,您需要不断循环遍历这些迭代器,直到您的某个文件被占用。你可以使用while循环,或者这里显示的是使用itertools循环:

import glob
import itertools

fs = glob.glob("./*py")  # Use glob module to get files with a pattern

fits = [open(i, "r") for i in fs]  # Create a list of file iterators

with open("blah", "w") as out:
    for f in itertools.cycle(fits):  # Loop over you list until one file is consumed
        try:
            l = next(f).split(" ")
            s = sorted(l)
            out.write(" ".join(s) + "/n")
            print s
        except:  # If one file has been read, the next(f) will raise an exception and this will stop the loop
            break

答案 1 :(得分:0)

这看起来与您提出的另一个问题有关(然后被删除)。

我假设您希望能够读取文件创建生成器组合生成器排序生成器的输出,然后写入文件

Using yield to form your generator makes life a lot easier.

请记住,要对每行进行排序,您必须将其存储在内存中。如果处理非常大的文件,你需要以更加记忆的方式处理它。

首先,让我们的生成器打开文件并逐行阅读:

def line_gen(file_name):
    with open(file_name, 'r') as f:
        for line in f.readlines():
            yield line

然后让"合并"生成器,通过创建一个生成器,它将按顺序迭代每个生成器。

def merge_gens(*gens):
    for gen in gens:
        for x in gen:
            yield x

然后我们可以创建我们的生成器:

gen1 = line_gen('f1.txt')
gen2 = line_gen('f2.txt')

结合它们:

comb_gen = merge_gens(gen1, gen2)

从生成器创建列表。 (这是潜在的内存密集型步骤。):

itered_list = [x for x in comb_gen]

对列表进行排序:

sorted_list = sorted(itered_list)

写入文件:

with open('f3.txt', 'w') as f:
    for line in sorted_list:
        f.write(line + '\n')