2012-06-28 31 views
4

額外的新線現有的文件我有一個文本文件附加線於具有在Python

 
apple 
banana 

現在你仔細觀察有在最後的空行。

當做追加

 
f = open("file.txt",'a') 
f.write("orange") 
f.close() 

我得到的輸出:

 
apple 
banana 

orange 

我想追加時刪除空行之間。

我知道我可以做到手動去文件和刪除額外的新行。但我想用python來做。所以每次的空行是有其獲取這樣的自動刪除:

 
apple 
banana 
orange 

我搜索和嘗試,但都無濟於事

+2

如果您追加到此文件,空行如何到達那裏? –

+0

邁克爾是正確的 - 處理新生產線最簡單的方法就是不要寫下來。 – abought

+0

@Michael:它的配置文件,有時你會手動編輯,並且由於錯誤而留下一兩個空行。其實它使用我的多個用戶,並將編輯它。無論如何,這只是我的好奇心,我怎麼能做到這一點.. – vipulb

回答

3

你不能,因爲,追加模式正是這麼做的:它追加。到換行。你將不得不閱讀文件,最後刪除換行符,寫出來然後追加。

或者,打開文件進行讀取和寫入(模式'r+'),尋求結束,刪除換行符,然後繼續寫入。

我認爲這可能做的伎倆:

f = open('file.txt', 'r+') 
f.seek(-2, 2) # last character in file 
if f.read(2) == '\n\n': 
    f.seek(-1, 1) # wow, we really did find a newline! rewind again! 
f.write('orange') 
f.close() 
+0

如果在文件末尾有*多*新行,我們只需要去掉換行符。 –

+1

此外,我不認爲'f.seek(-1)'的作品。第一次調用你需要'f.seek(-1,2)',第二次調用'f.seek(-1,1)'。 –

3

一個簡單的解決方案是要覆蓋而不是就地修改它的整個文件:

with open("file.txt") as input: 
    # Read non-empty lines from input file 
    lines = [line for line in input if line.strip()] 
with open("file.txt", "w") as output: 
    for line in lines: 
     output.write(line) 
    output.write("orange\n") 

此代碼將罰款,只要工作該文件不是太大。

您可以通過打開文件進行讀寫操作,在文件末尾找到換行符的數量,尋找位於第一個尾隨換行符後面的位置,然後寫入要追加的行。這樣更高效,但也需要更詳細的代碼,所以如果簡單的解決方案不夠快,我只會這樣做。

編輯:這是我拿上這樣做的更有效的方法:

with open("file.txt", "r+U") as f: 
    try: 
     f.seek(-1, 2) 
     while f.read(1) == "\n": 
      f.seek(-2, 1)  # go back two characters, since 
           # reading advances by one character 
    except IOError:   # seek failed, so the file consists 
     f.seek(0)    # exclusively of newline characters 
    else: 
     f.write("\n")   # Add exactly one newline character 
    f.write("orange\n")  # Add a new line 

這可以正確處理任意數量的尾隨換行字符,包括沒有比兩家都以上。

1

這裏是另一種解決方案,在地方與文件的工作原理:

with open('fruit.txt','rU+') as f: 
    f.seek(-2,2) 
    if(f.read(2) == "\n\n"): 
     f.seek(-1,2) 
    f.write('strawberry\n') 

我們打開文件進行讀寫('r+')。然後我們從最後尋找2個字節。我們閱讀這些字節。 (文件指針不在文件的末尾)。如果這些字節都是換行符,我們退後一個字節。然後我們編寫我們的新數據。

編輯在更一般的情況:

def goto_my_eof(f): 
    """Position file pointer after last newline in file 
     raises IOError if the file is "empty" (has no contents or only whitespace) 
    """ 
    n=-1 
    f.seek(n,2) 
    mychar=f.read(1) 
    #Step backward, one character at a time, looking for non-whitespace 
    while not (mychar.strip()): 
     n-=1 
     f.seek(n,2) 
    mychar=f.read(1) 
    #seek to the position after the non-whitespace position 
    f.seek(n+1,2) 
    #write one newline and continue. 
    f.write('\n') 

似乎工作(一個小實驗後)。此外,這將剝離任何空白(不只是換行符)。這個和@SvenMarnach(誰更優雅地使用tryexcept捕捉錯誤)的答案的一些組合將是偉大的。在我的函數中,如果出現except IOError(因爲該函數假定文件中有一些非空白文本),可以將它放在try/except中,並設法定位0。

10

使用:

f = open("file.txt",'ab') 

'AB',而不是隻有 '一個'

0

我會寫這個代碼到一個新的行添加到文件:

f=open('newfile.txt','a') 

t=raw_input('write here something you like: ') 

f.write(t+'\n') 

再到閱讀文件中的內容,啓動外殼並輸入:

with open('newfile.txt','a') as f: 
    for l in f: 
     print l 

這將打印文件中的所有內容。

我希望它能回答你的問題!