web-dev-qa-db-ja.com

Pythonのファイルを読み取り、上書きします

現在、私はこれを使用しています:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()

しかし問題は、古いファイルが新しいファイルよりも大きいことです。そのため、最後に古いファイルの一部を持つ新しいファイルになります。

93
compie

ファイルを閉じて再度開きたくない場合は、競合状態を避けるために、 truncate it:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()

機能は cleaner and safer mVChrのコメントごとにwith open asを使用することもできます。これにより、エラーが発生した場合でもハンドラーが閉じられます。

with open(filename, 'r+') as f:
    text = f.read()
    text = re.sub('foobar', 'bar', text)
    f.seek(0)
    f.write(text)
    f.truncate()
164
nosklo

おそらく、text = re.sub('foobar', 'bar', text)の後にファイルを閉じ、書き込み用に再度開いて(古いコンテンツを消去する)、更新されたテキストを書き込む方が簡単で整然としているでしょう。

15
Il-Bhima

fileinput モジュールには、一時ファイルなどを使用せずに処理中のファイルに変更を書き込むためのinlineモードがあります。モジュールは、オブジェクトを介して、ファイルのリストの行をループする一般的な操作をうまくカプセル化しますループ内でそれらを検査する必要がある場合、ファイル名、行番号などを透過的に追跡します。

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    if "foobar" in line:
         line=line.replace("foobar","bar")
    print line
14
ghostdog74