2013-04-08 52 views
2

我需要編寫一個函數shuffleFiles(afile,bfile,cfile),它從文件afile讀取一行,然後從文件bfile讀取一行並追加這些行分別到文件C.如果文件afile或bfile已被完全讀取,則繼續將另一個文件的行追加到文件C中。PYTHON:從2個文件交替讀取行並追加到第三個

這是我到目前爲止的代碼,行沒有寫入文件,但是如果我將它們換成打印語句,則會以正確的順序打印出行,只是在大多數行之間留有空白\ 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() 
+0

爲什麼不你只是做'cat afile bfile >> cfile'? – Blender 2013-04-08 00:17:50

回答

1

這裏有一種方法來遍歷兩個交替iterables(包括文件):

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 「拉鍊」 在一起的兩個或更多iterables:

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

最後,filterNone作爲第一個參數只返回非假值的值。在這種情況下,它用於過濾掉上面列表中的None(當一個迭代比另一個更長時,將出現Nones),並篩選出可能存在於文件中的空字符串''

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

編輯 - 感謝Tadeck

把所有的這一起,用更Python 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))) 
+2

我只是寫了類似的解決方案:)你可以考慮添加'with'語句來打開和關閉文件,另外也可以使用'writelines()'。整個解決方案看起來像'fileC.writelines(filter(None,chain.from_iterable(izip_longest(a,b))))'。 Upvote去找你:) – Tadeck 2013-04-08 00:26:31

+0

@Tadeck:很好的觀察!看我的編輯。 – 2013-04-08 00:40:40

相關問題