2011-03-27 46 views
37

是否可以逐行解析文件,並在遍歷行的同時編輯一行?是否可以修改文件中的行?

+1

有可能在某些條件下。如果編輯處理過的生產線所產生的生產線較短或與生產生產線長度相同,則很容易做到。如果不是這種情況,則變得更加困難,但如果進行編輯的線條不是太多的話,則不是不可能的。你問這個是因爲你想處理一個大文件嗎? – eyquem 2011-03-27 23:58:01

+1

>>> f = open('tmp','r +') >>> f.readline() '75 .14 \ n' >>> f。readline() '100 \ n' >>> l = _ >>> f.seek(-l.len(),file.SEEK_CUR) >>> f.seek(-len(l),os .SEEK_CUR) >>> f.write('999 \ n') >>> f.close() >>> – Bob 2011-03-28 00:02:36

+0

請參閱此處的示例(http://stackoverflow.com/questions/5286020/python-string - 替換文件 - 不觸及文件 - 如果不替換 - ) – eyquem 2011-03-28 00:06:10

回答

34

是否有可能逐行解析文件,並在通過這些行時在位編輯一行?

它可以使用stdlib的fileinput module的備份文件進行模擬。

下面是一個例子腳本,其去除不從命令行或stdin上給定文件滿足some_condition行:

#!/usr/bin/env python 
# grep_some_condition.py 
import fileinput 

for line in fileinput.input(inplace=True, backup='.bak'): 
    if some_condition(line): 
     print line, # this goes to the current file 

實施例:

$ python grep_some_condition.py first_file.txt second_file.txt 

完成後first_file.txtsecond_file.txt文件將包含只有滿足some_condition()謂詞的行。

+0

實際上並沒有寫入文件中間的方法也是明智的,因爲它很容易使修改成爲原子性的(也就是說,如果程序被中斷,文件不會以部分修改的狀態結束)。 – L33tminion 2015-06-17 18:22:03

0

您必須按照字符的大小來備份。假設你使用readline,那麼你就可以得到該行的長度和備份使用:

file.seek(offset[, whence]) 

設置何處來SEEK_CUR,將偏置置-length

請參閱Python Docs或查看seek的聯機幫助頁。

4

不可以。您無法安全地寫入您正在閱讀的文件,因爲您對該文件所做的任何更改都可能會覆蓋您尚未閱讀的內容。要做到這一點,你必須將文件讀入緩衝區,根據需要更新任何行,然後重新寫入文件。

如果要替換文件中的內容(即,如果要替換的文本長度與您替換的新字符串的長度相同),則可以避開它,但它是一個大黃蜂巢,所以我會省下麻煩,只讀完整文件,替換內存中的內容(或通過臨時文件),然後再寫出來。

+2

模式'rb +'允許讀取,移動和寫入文件 – eyquem 2011-03-28 00:10:54

+1

@eyquem - 好點,我會更新我的答案。 – 2011-03-28 00:15:25

2

如果您只打算執行不會更改被修改文件部分長度的本地化更改(例如,將所有字符更改爲小寫),那麼您實際上可以動態覆蓋文件的舊內容。

爲此,您可以使用隨機文件訪問與file對象的seek()方法。

或者,您可以使用mmap對象將整個文件視爲可變字符串。請記住,mmap對象可能會在32位CPU上的2-4 GB範圍內施加最大文件大小限制,具體取決於您的操作系統及其配置。

相關問題