簡體   English   中英

python-修改后重寫文件

[英]python - rewrite a file with modifications

我有一個名為inputs.txt的文件,我試圖用功能值替換該文件中的字符串。 問題是我無法寫入該文件。 我剛剛開始學習python,因此為此感到吃力。 請幫忙。

當我將其作為字符串時,它可以正常工作

文件內容

[aws_s3://MAC_10]
key_name = ABC/YYZZ/daily

所需的輸出

[aws_s3://MAC_2014-12-31]
key_name = ABC/YYZZ/daily/2014-12-31_

我編寫了將時間值作為

def change_time(match):
    match = match.group()
    date_time = datetime.datetime.now()
    value = str(date_time.strftime('%Y-%m-%d'))
    return value

我可以打開文件並讀取和匹配內容,但無法寫入文件

f=open('test.txt','w')

print re.sub(r'_[0-9-]+',change_time,string)將所需的已更改第一行輸出到stdout,但是如何修改文件的內容?

讀取和寫入相同的文件可能很棘手,但是標准庫的fileinput模塊很好地支持了這一點:

import fileinput

for line in fileinput.input(['inputs.txt'], inplace=True):
    print re.sub(r'_[0-9-]+', change_time, line) ,

我正在提供Python 2 print形式,因為這似乎就是您所使用的。 無論如何,在Python 3中它將是相似的並且更具可讀性:

    print(re.sub(r'_[0-9-]+', change_time, line), end='')

無論如何, fileinput重定向標准輸出,以便所有print轉到您正在讀取的文件中(當inplace=True設置完畢時)-您需要打印出所有正在讀取的內容,並且需要進行更改。 可以根據需要處理任意數量的文件(請注意,第一個參數是文件名列表),無論它們有多大,依此類推。

有關更多詳情,請參見https://docs.python.org/2/library/fileinput.html :-)

如果您沒有編寫太多程序,可能很容易想到文件,就像在編輯器中看到的那樣,您可以在其中將光標定位在特定點上並在該點處插入字符,從而導致文件中的其他字符“滑動”。在右邊”。 這種方式無法寫入文件。 相反,在特定位置寫入文件會刪除該位置之后的所有文件內容,這意味着您需要將整個文件讀入內存,修改文件的內容,然后將內容寫回到文件中。

更具體地說,由於修改后文件中的字節數將不同,並且所有字符的插入/刪除操作都不會在文件末尾進行,因此通常要遵循以下步驟:

首先,您將文件的全部內容讀入內存,例如

import io
with io.open('file.ini') as fobj:
    contents = fobj.read()

請注意,運行此代碼后,文件將再次關閉:您已將文件的內容復制到內存中,並且文件在磁盤上保持不變。

接下來,以所需的方式修改文件的內容

def change_time(match):
    match = match.group()
    date_time = datetime.datetime.now()
    value = str(date_time.strftime('%Y-%m-%d'))
    return value

new_contents = re.sub(r'_[0-9-]+',change_time,contents)

現在,您以寫模式重新打開文件。 這將立即丟棄文件的內容,並且您從內存中寫回自己的副本(已修改)

with io.open('file.ini','wb') as fobj:
    fobj.write(new_contents)

解決方案是讀入值,編輯內存中的更改並寫入新值

contents = open('file.ini').read()
contents = re.sub(r'_[0-9-]+',change_time,contents)
with open('file.ini', 'w') as fout:
    fout.write(contents)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM