現在、私はこれを使用しています:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
しかし問題は、古いファイルが新しいファイルよりも大きいことです。そのため、古いファイルの一部が最後にある新しいファイルになります。
競合状態を回避するために、ファイルを閉じて再度開きたくない場合は、次のようにすることができ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()
fileinput
モジュールには、一時ファイルなどを使用せずに、処理中のファイルに変更を書き込むモードがあります。inplace
モジュールは、ファイル名を透過的に追跡するオブジェクトを介して、ファイルのリスト内の行をループする一般的な操作をうまくカプセル化します。ループ内でそれらを検査する必要がある場合は、行番号など。
from fileinput import FileInput
for line in FileInput("file", inplace=1):
line = line.replace("foobar", "bar")
print(line)
おそらく、 の後でファイルを閉じてtext = re.sub('foobar', 'bar', text)
、書き込み用に再度開き (古い内容をクリアして)、更新したテキストを書き込む方が簡単できれいでしょう。
行ごとに読み書きしたい人は、この回答を参照してください。 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()
新しいファイルに書き込んでみてください。
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()