繁体   English   中英

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

[英]How to sort line by line in multi files in Python?

我有一些文本文件,我想逐个文件和逐行读取文件,并排序并写入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
#

您可以在文件上使用迭代器列表。 然后,您需要不断循环遍历这些迭代器,直到使用完一个文件为止。 您可以使用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

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

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

使用yield来生成您的生成器会使工作变得更加轻松。

请记住,要像这样对每一行进行排序,您必须将其存储在内存中。 如果处理非常大的文件,则需要以一种内存意识更高的方式来处理它。

首先,让您的生成器打开文件并逐行读取:

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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM