2014-03-26 21 views
0

我想合併兩個文件的內容到一個新的輸出文件。文件不合並:python

我已閱讀關於合併文件內容的其他線程,我嘗試了幾個選項,但我只輸出一個文件。這是我嘗試的代碼之一,我看不出有什麼問題。

我只在我的輸出中得到一個文件,即使我切換了列表中的file1和file2的位置,我仍然只在我的輸出中只獲得file1。

這裏是我的代碼:

filenames = ['file1','file2'] 
with open('output.data', 'w') as outfile: 
    for fname in filenames: 
     with open(fname) as infile: 
      outfile.write(infile.read()) 

我怎樣才能做到這一點?

我,導致合併這兩個文件

source1 = open('A','r') 
output = open('file1','w') 
output.write(',yes.\n'.join(','.join(line) for line in source1.read().split('\n'))) 

source1 = open('B', 'r') 
output = open('file2','w') 
output.write(',no.\n'.join(','.join(line) for line in source2.read().split('\n'))) 

filenames = ['file1','file2'] 
with open('output.data', 'w') as outfile: 
    for fname in filenames: 
     with open(fname) as infile: 
      outfile.write(infile.read()) 
+1

我假設這兩個文件確實包含一些東西? – aquavitae

+1

你的代碼是正確的。檢查「file1」和「file2」是否存在並檢查其內容。同時檢查你是否正在檢查正確的輸出文件。 – justhalf

+0

@aquavitae否則,他甚至不會在輸出中看到其中一個文件的內容? – shaktimaan

回答

1

編輯完成後,清楚您的錯誤在哪裏。您需要在寫入之後關閉(或清空)該文件,然後才能用相同的代碼讀取該文件。

source1 = open('A','r') 
output = open('file1','w') 
output.write(',yes.\n'.join(','.join(line) for line in source1.read().split('\n'))) 
output.close() 

source2 = open('B', 'r') 
output = open('file2','w') 
output.write(',no.\n'.join(','.join(line) for line in source2.read().split('\n'))) 
output.close() 

filenames = ['file1','file2'] 
with open('output.data', 'w') as outfile: 
    for fname in filenames: 
     with open(fname) as infile: 
      outfile.write(infile.read()) 

之所以第一個文件是可用的,因爲你通過重新分配變量output來保存文件描述符file2刪除提及的file1文件描述符,它會自動被Python關閉。

正如@gnibbler建議的那樣,最好使用with語句來避免將來出現這種類型的問題。您應該將source1,source2output放在with語句中,就像您爲最後一部分所做的那樣。

+0

還需要.close()之前寫一個換行符,或者第一個文件的最後一行和第二個文件的第一行將被修改。 –

+0

@ m.wasowski:我不知道。但是從我的測試中,我發佈了代碼,儘管沒有最終換行符。 – justhalf

+0

它工作正常,如果文件已經以'\ n''結尾。如果它們不是,則會有問題,因爲'\ n'.join'不會在最後一個元素之後添加換行符。就像你「貓」的文件一樣。 –

1

的第一個文件完整的代碼,當你重新綁定output到一個新的文件被關閉/刷新。這是CPython的行爲,但它不是很好的依靠它

使用上下文管理器,以確保文件被刷新(或關閉)正常,你試着從他們

with open('A','r') as source1, open('file1','w') as output: 
    output.write(',yes.\n'.join(','.join(line) for line in source1.read().split('\n'))) 

with open('B','r') as source2, open('file2','w') as output: 
    output.write(',no.\n'.join(','.join(line) for line in source2.read().split('\n'))) 

filenames = ['file1','file2'] 
with open('output.data', 'w') as outfile: 
    for fname in filenames: 
     with open(fname) as infile: 
      print("Reading from: " + fname) 
      data = infile.read() 
      print(len(data)) 
      outfile.write(data) 

有閱讀前在前兩個模塊中是相當重複的。也許你可以在那裏使用一個功能。

+0

這有資格作爲答案嗎?我認爲這應該在評論部分 – justhalf

+0

@justhalf,在評論中發佈代碼有點困難。我將添加到這個答案,因爲OP提供了更多的信息 –

1

你可以將你的閱讀和寫入結合成一個語句(如果你不需要中間文件);這也將解決你的關閉問題:

with open('A') as a, open('B') as b, open('out.txt','w') as out: 
    for line in a: 
     out.write(',yes.\n'.join(','.join(line))) 
    for line in b: 
     out.write(',no.\n'.join(','.join(line)))