PYTHON:交替读取两个文件中的行并附加到第三个文件

2024-10-01 17:31:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要写一个函数shuffleFiles(afile,bfile,cfile),它从文件afile读取一行,然后从bfile读取一行,并将这些行分别追加到文件C中。如果文件afile或bfile中的任何一个已经被完全读取,则继续将另一个文件中的行追加到文件C中

这是到目前为止我的代码,这些行没有写入文件,但是如果我将它们换成print语句,那么这些行将以正确的顺序打印出来,只是其中大多数行之间有一个\n空白。不知道该怎么办

def shuffleFiles(afile, bfile, cfile):
  fileA = open(afile, 'r')
  fileB = open(bfile, 'r')
  fileC = open(cfile, 'a')
  fileADone = False
  fileBDone = False
while not fileADone or not fileBDone:
    if not fileADone:
        line = fileA.readline()
        line.rstrip()
        line.strip()
        if line == "" or line == " " or line == "/n":
            fileADone = True
        else:
            fileC.write(str(line))
    if not fileBDone:
        line = fileB.readline()
        line.rstrip()
        line.strip()
        if line == "" or line == " " or line == "/n":
            fileBDOne = True
        else:
            fileC.write(str(line))

fileA.close()
fileB.close()
fileC.close()

Tags: or文件closeiflinenotopencfile
1条回答
网友
1楼 · 发布于 2024-10-01 17:31:09

这里有一种方法可以迭代两个交替的iterable(包括文件):

from itertools import chain, izip_longest

fileA = open('file_A.txt')
fileB = open('file_B.txt')

for line in filter(None, chain.from_iterable(izip_longest(fileA, fileB))):
    #Do stuff here.

izip_longest“zip”两个或多个iterable:

^{pr2}$

然后chain.from_iterable将这些链接成一个长时间运行的iterable:

>>> list(chain.from_iterable(izip_longest(a, b)))
[1, 'a', 2, 'b', 3, 'c', 4, 'd', None, 'e', None, 'f']

最后,以None作为第一个参数的filter只返回具有非false值的值。在本例中,它用于过滤掉上面列表中的None(当一个iterable比另一个长时,Nones将出现),并过滤出文件中可能存在的''空字符串。在

>>> filter(None, chain.from_iterable(izip_longest(a, b)))
[1, 'a', 2, 'b', 3, 'c', 4, 'd', 'e', 'f']

编辑-感谢Tadeck

将所有这些加在一起,再加上用于打开文件的pythonic with运算符,我们得到如下结果:

with open('fileA.txt') as fileA, open('fileB.txt') as fileB, open('fileC.txt') as fileC:
    lines = chain.from_iterable(izip_longest(fileA, fileB, fillvalue=''))
    fileC.writelines(filter(None, (line.strip() for line in lines)))

相关问题 更多 >

    热门问题