2016-09-29 50 views
0

我正在加載一個文件,並將某些預定義的行修改爲某些值。 以下是我的嘗試:修改行

with open("test.txt",'w') as f: 
       for i,line in f: 
        if (i == 2): 
         f.writelines(serial1) 
        if (i == 3): 
         f.writelines(serial2) 
        if (i == 4): 
         f.writelines(serial3) 
        else: 
         f.writelines(line) 

但是,在運行我得到了以下錯誤代碼時:

for i,line in f: 
io.UnsupportedOperation: not readable 

我在做什麼錯?

+1

您使用'w',*只寫*模式打開文件。即使如此,即使您改變了這一點,也不會這樣做;你不能簡單地寫入文件的中間(至少沒有*覆蓋*其餘部分)。 – deceze

+0

看到這個答案:http://stackoverflow.com/a/2081880/11208 –

+1

我想你會希望'爲我,在任何情況下列舉(f)'。 – chepner

回答

2

你在做什麼叫做編輯到位。爲此,Python標準庫fileinput可以幫助:

import fileinput 

for line in fileinput.input('test.txt', inplace=True): 
    if fileinput.lineno() == 2: 
     print serial1 
    elif fileinput.lineno() == 3: 
     print serial2 
    elif fileinput.lineno() == 4: 
     print serial3 
    else: 
     print line 

更新

至於 「我做錯了嗎?」有一對夫婦:

  • 你打開文件寫入,你怎麼讀取它?您可能會嘗試將模式從「w」更改爲「r +」,即讀取和寫入。這帶來了另一個困境:在讀取第2行之後,文件指針位於第3行的開頭,任何寫入的內容都會覆蓋第3行,更不用說新舊行之間的長度差異了。最好寫入一個新的臨時文件,然後在完成時將其複製回原始文件,或者如上所示使用fileinput
  • for i, line in f不起作用,我想你的意思是for i, line in enumerate(f, 1)
  • 什麼是非常深的縮進?
  • if聲明應爲if ... elif ... else。目前,您的其他條款僅附於if i == 4聲明,而不是其他兩項。
1

您打開文件以進行只寫(w模式)並嘗試讀取它 - 這由for語句完成。

即:在讀取文件時,使用for語句對文件進行迭代。

如果您打算寫信給它,for上的文件本身不能幫助您 - 只需使用帶有「範圍」的普通計數器並寫入即可。

with open("test.txt",'w') as f: 
    for i in range(desired_lines): 
     if (i == 2): 
      f.write(serial1 + "\n") 
     if (i == 3): 
      f.write(serial2 + "\n") 
     if (i == 4): 
      f.write(serial3 + "\n") 
     else: 
      f.write(line + "\n") 

此外,writelines應該當你有你想要寫, 每個INA單獨的行字符串列表中使用 - 玉不顯示你vaiables的內容給你想要的確切路線,但數字,它看起來像writelines是不是你想要的。

(在一個側面說明 - 縮進小心 - 你應該IDENT你在Python輸入一個固定ammount的的foreach塊 - 這將有arbitrry identation像你這樣的工作,而不是通常在Python代碼)

更新 它看起來像你需要改變一些已經存在的文本文件的一些行。對此的最佳方法是重新創建另一個文件,替換所需的行,然後重命名所有內容。 (寫入文本文件幾乎是不可行的,因爲所有文本行必須與先前存在的行相同 - 並且在低級磁盤訪問中仍然不會獲得任何結果)。

import os 

... 

lines_to_change{ 
    2: serial1, 
    3: serial2, 
    4: serial3, 
} 

with open("test.txt",'rt') as input_file, open("newfile.txt", "wt") as output_file: 
    for i, line in enumerate(input_file): 
     if i in lines_to_change: 
      output_file.write(lines_to_change[i] + '\n') 
     else: 
      output_file.write(line) 

os.rename("test.txt", "test_old.txt") 
os.rename("newfile.txt", "test.txt") 
os.unlink("test_old.txt") 
+0

如何從文件中獲取「當前」行? –

+0

無法獲得「當前行」 - 如果您正在寫入該行,則會銷燬先前的文件。可以打開文件進行讀取和寫入 - 但這通常是用二進制文件完成的,其中有固定大小的字段,而不是文本。 – jsbueno

+0

如果你想生成一個文本文件,只是修改了另一個文件,現有的文件的方法是重新創建另一個文件,其中重寫所有信息,更改所需信息,刪除舊文件並重命名當你完成一個新的 - 我會用這種方法的例子更新答案 – jsbueno

0

正如指出的那樣,你的問題是你試圖在同一個文件中讀寫。最簡單的方法是打開一個新文件,並在有所需輸出時替換第一個文件。

要獲得文件的行數,你可以使用enumerate

with open("test.txt",'r') as f: 
       for i,line in enumerate(f): 
        if (i == 2): 
         f.writelines(serial1) 
        if (i == 3): 
         f.writelines(serial2) 
        if (i == 4): 
         f.writelines(serial3) 
        else: 
         f.writelines(line)