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

时间:2013-04-08 00:11:21

标签: python io append readline

我需要编写一个函数shuffleFiles(afile,bfile,cfile),它从文件文件中读取一行,然后从文件bfile中读取一行,并将这些行分别附加到文件C中。如果文件文件或文件已经过了完全读取然后继续将其他文件中的行附加到文件C中。

这是我到目前为止的代码,这些行没有被写入文件,但是如果我将它们换成print语句,那么这些行会以正确的顺序打印出来,只是在大多数行之间有空白\ n \ 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()

1 个答案:

答案 0 :(得分:1)

这是迭代两个交替迭代(包括文件)的一种方法:

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“将两个或更多个迭代”拉到一起:

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

然后chain.from_iterable将这些链接成一个长期运行的可迭代:

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

最后,filter None作为第一个参数,只返回带有非假值的值。在这种情况下,它用于过滤掉上面列表中的None(当一个可迭代的长度超过另一个时,将发生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)))