2015-07-03 49 views
1

我寫了一些代碼,從一個大的文本文件中提取一定行,發現一些奇怪的事情失蹤,所以我跑了下面的代碼,以確保for循環實際上是碰到文件中的每一行:爲什麼不是'在文件中行'複製我的文本文件中的所有行?

xf=open("bigFile.txt", r) 
xxf=open("newFile.txt",w) 
for line in xf: 
    xxf.write(line) 

由於某種原因,這最終不會複製所有行。誰能告訴我我不理解或做錯了什麼?它最終只能製作一個大約60-70%的文件?任何有識之士將不勝感激。

編輯:謝謝輸入skrrgwasme & Shreevardhan。爲了澄清,我的最終目標不僅是要複製的文件,在我工作的代碼,我把一些比較符寫入行之前,例如:

for line in xf: 
firstChar=line[:1] 
if firstChar==1: 
    xxf.write(line) 

那就是爲什麼我使用了」行文件」。我應該以其他方式做這個嗎?

+0

你可以嘗試調用'xxf.flush()'在某些時候。並在下面檢查[skrrgwasme](https://stackoverflow.com/users/2615940/skrrgwasme)的答案。 –

回答

0

您需要關閉文件。無法保證在腳本退出前您正在寫入的緩衝區正在刷新到磁盤。您可以通過使用上下文管理做到這一點很容易:

with open("bigFile.txt") as xf, open("newFile.txt", "w") as xxf: 
    for line in xf: 
     xxf.write(line) 

在你現在的代碼,你會寫xf.close()xxf.close(),但使用情況管理器這樣會爲您處理它,甚至關閉,如果文件發生異常。

此外,如果您確實只是複製文件,您還可以使用shutil.copyfile()

+0

感謝您的幫助,但是當我完全按照您的要求編寫它時,我仍然沒有複製所有行。你是對的,我不是簡單的複製,而是測試上面的代碼,沒有比較運算符來確保它正在獲取每一行。使用上面的代碼和我的原始代碼,當我在一個400MB的文件上運行它時,它會返回一個只有大約275MB的文件。這真的讓我撓了腦袋。 – codezilla

+0

@codezilla你看過輸出文件來確認是否有缺失的行,或只是看着文件大小?它可能會以比源文件更密集的編碼寫出來。 – skrrgwasme

+0

是的我看過這些文件,副本只有550k行左右,而原始文件大約是800k行。我真的不知道爲什麼一個簡單的「for x in file」循環不會複製文件行的行?我是否正確理解這個循環,如果我像我在我的例子中那樣編寫for循環,它應該複製文件的每一行? – codezilla

0

要複製文件,最好使用shutil模塊的功能,如copyfile(),copy()copy2()

例如

from shutil import copyfile, copy2 
copyfile('bigFile.txt', 'newFile.txt') 

copy2('bigFile.txt', 'newFile.txt') 
+0

嘿Shreevardhan,感謝您的回答,但是我不認爲這將適用於我的情況BC我試圖做一些比較,然後複製生產代碼中的每一行。對於誤解抱歉,我試圖在上面進一步澄清。 – codezilla

相關問題