2016-07-05 11 views
1

我試圖刪除從一個文本文件中的空行,所以如果我有,例如:地帶從文本文件中的空行

line 1 
line 2 

line 3 


line 4 
line 5 

處理的文件應該是這樣之後的結果:

line 1 
line 2 
line 3 
line 4 
line 5 

我搜索堆棧溢出,這就是我想出了迄今:

with open('file.txt', 'r+', encoding='utf-8') as file: 
    for line in file: 
     if line.strip(): 
      file.write(line) 

這正常,只是FO有一點不方便;而不是被替換的內容與新的,結果被附加到文件的結尾,像這樣:

line 1 
line 2 

line 3 


line 4 
line 5line 1 
line 2 
line 3 
line 4 
line 5 

我的問題是,有沒有什麼辦法可以解決內部的這一問題for循環,無需外部存儲(將結果存儲在文件或列表中並將其寫回文件)?或者如果有更好的方式,請分享。

我希望我的問題很清楚,謝謝。

+1

打開用於輸出的第二個文件。然後在完成刪除第一個文件,並重命名第二個原始名稱 –

+0

看到這篇文章:http://stackoverflow.com/questions/2369440/how-to-delete-all-blank-lines-in-the-file-with- python –

+0

好幫手謝謝 – user3885884

回答

1

因此,首先,輸出會附加到文件,因爲您在r+模式下打開文件,並且文件指針指向文件的末尾。你不會希望在你讀它,雖然覆蓋文件,那麼你真的需要兩個文件:

with open('infile.txt', 'r', encoding='utf-8') as inFile,\ 
    open('outfile.txt', 'w', encoding='utf-8') as outFile: 
    for line in inFile: 
     if line.strip(): 
      outFile.write(line) 
+0

我希望有一種方法可以避免這種情況,但沒關係。非常感謝你。 – user3885884

+0

沒問題,樂於幫忙! :)寫完之後,您總是可以用新創建的文件覆蓋原始文件。這有附加好處,如果出現問題,您可以避免丟失數據。 – Will

2

這裏是一個工作的例子,你在找什麼。 我不知道這裏的性能但可以肯定它不使用內存或臨時文件

writebytecount = 0 
readbytecount = 0 
with open('file2.txt', 'r+') as file: 
    while 1: 
     line = file.readline() 
     if not line: break 
     readbytecount = file.tell() 
     file.seek(writebytecount) 
     file.write(line) 
     if len(line.strip()) != 0: 
      writebytecount += len(line)+1 
     file.seek(readbytecount) 
    file.seek(writebytecount) 
    file.truncate(writebytecount) 
    file.close() 
相關問題