次のコードがあります:
import re
#open the xml file for reading:
file = open('path/test.xml','r+')
#convert to string:
data = file.read()
file.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data))
file.close()
ファイル内の古いコンテンツを新しいコンテンツに置き換えたいのですが、コードを実行すると、ファイル「test.xml」が追加されます。つまり、古いコンテンツの後に新しい「置き換えられた」コンテンツが続きます。古いものを削除して新しいものだけを残すにはどうすればよいでしょうか。
ベストアンサー1
必要なのはseek
書き込む前にファイルの先頭に追加し、file.truncate()
インプレース置換を行う場合:
import re
myfile = "path/test.xml"
with open(myfile, "r+") as f:
data = f.read()
f.seek(0)
f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>", r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", data))
f.truncate()
他の方法は、ファイルを読み込んでから、次のコマンドで再度開くことですopen(myfile, 'w')
。
with open(myfile, "r") as f:
data = f.read()
with open(myfile, "w") as f:
f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>", r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", data))
どちらtruncate
もopen(..., 'w')
変化しないiノードファイル番号 (Ubuntu 12.04 NFS で 1 回、ext4 で 1 回、合計 2 回テストしました)。
ちなみに、これはPythonとはあまり関係ありません。インタープリタは対応する低レベルAPIを呼び出します。この方法はtruncate()
Cプログラミング言語でも同じように機能します。http://man7.org/linux/man-pages/man2/truncate.2.html