130

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

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

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

4

7 に答える 7

207

競合状態を回避するために、ファイルを閉じて再度開きたくない場合は、次のようにすることができtruncateます。

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

この機能は、エラーが発生した場合でもファイル ハンドラーを閉じるコンテキスト マネージャーとして使用することで、よりクリーンで安全になる可能性があります。open

with open(filename, 'r+') as f:
    text = f.read()
    text = re.sub('foobar', 'bar', text)
    f.seek(0)
    f.write(text)
    f.truncate()
于 2010-03-11T11:16:18.460 に答える
21

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

from fileinput import FileInput
for line in FileInput("file", inplace=1):
    line = line.replace("foobar", "bar")
    print(line)
于 2010-03-11T10:08:38.277 に答える
16

おそらく、 の後でファイルを閉じてtext = re.sub('foobar', 'bar', text)、書き込み用に再度開き (古い内容をクリアして)、更新したテキストを書き込む方が簡単できれいでしょう。

于 2010-03-11T10:04:09.263 に答える
0

行ごとに読み書きしたい人は、この回答を参照してください。 https://stackoverflow.com/a/71285415/11442980

filename = input("Enter filename: ")
with open(filename, 'r+') as file:
    lines = file.readlines()
    file.seek(0)
    for line in lines:
        value = int(line)
        file.write(str(value + 1))
    file.truncate()
于 2022-02-27T14:13:55.083 に答える
-2

新しいファイルに書き込んでみてください。

f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()
于 2016-06-29T11:59:40.067 に答える