2015-02-07 42 views
10

我想追加一個字符串到文件,如果字符串不在文件中退出。但是,使用a+選項打開文件不允許我一次執行,因爲使用a+打開文件會將指針指向文件末尾,這意味着我的搜索將始終失敗。有沒有什麼好辦法可以做到這一點,而不是打開文件先閱讀,關閉並再次打開追加?Python:打開一個文件,搜索然後追加,如果不存在

在代碼中,顯然,以下不起作用。

file = open("fileName", "a+") 

我需要做以下來實現它。

file = open("fileName", "r") 
... check if a string exist in the file 
file.close() 

... if the string doesn't exist in the file 
file = open("fileName", "a") 
file.write("a string") 
file.close() 
+2

您需要的是查找操作http://www.tutorialspoint.com/python/file_seek.htm – 2015-02-07 17:49:11

+1

您是否想檢查子字符串,行或實際的字? – 2015-02-07 17:54:07

+0

嗯。在我的情況下,一個子字符串。 – 2015-02-07 18:43:39

回答

13

離開輸入文件保持不變,如果needle是在任何線路或針在文件的末尾添加如果它缺少:

with open("filename", "r+") as file: 
    for line in file: 
     if needle in line: 
      break 
    else: # not found, we are at the eof 
     file.write(needle) # append missing data 

我測試了它,它可以在Python 2(基於stdio的I/O)和Python 3(基於POSIX讀/寫的I/O)上運行。

該代碼在循環Python語法後使用隱藏的else。請參閱Why does python use 'else' after for and while loops?

+0

爲什麼-1?它似乎做什麼是想要的...... – glglgl 2015-02-07 17:51:50

+2

@glglgl:或許一個downvoter不熟悉循環後面的「else」語法,他們認爲我錯誤地使用了縮進。 – jfs 2015-02-07 18:00:27

6

您可以使用file.seek()來設置文件對象的當前位置。要跳轉到一個文件的開頭,使用

f.seek(0, os.SEEK_SET) 

要跳轉到文件的末尾,使用

f.seek(0, os.SEEK_END) 

你的情況,以檢查文件中包含的東西,然後也許追加追加到該文件,我會做這樣的事情:

import os 

with open("file.txt", "r+") as f: 
    line_found = any("foo" in line for line in f) 
    if not line_found: 
     f.seek(0, os.SEEK_END) 
     f.write("yay, a new line!\n") 
+0

感謝您的回答。我重新排列了我正在檢查的文件內容,並以某種方式檢查文件中的字符串。在進行檢查之前,我必須首先使用'f.seek(0,os.SEEK_SET)'跳到文件的開頭,然後在寫入文件之前跳到文件的末尾。 – 2017-05-16 19:56:13

相關問題