我有一些文本文件,我想逐个文件地逐行读取,并在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
#
答案 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')