132

次のコードがあります。

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」が追加されます。つまり、古いコンテンツの後に新しい「置き換えられた」コンテンツが続きます。古いものを削除して新しいものだけを残すにはどうすればよいですか?

4

6 に答える 6

147

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()

もう1つの方法は、ファイルを読み取ってから、次のコマンドで再度開くことです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))

ファイルのinodetruncate番号もopen(..., 'w')変更しません(Ubuntu 12.04 NFS で 1 回、ext4 で 1 回、2 回テストしました)。

ところで、これは実際には Python とは関係ありません。インタープリターは、対応する低レベル API を呼び出します。メソッドtruncate()は C プログラミング言語でも同じように機能します。 http://man7.org/linux/man-pages/man2/truncate.2.htmlを参照してください。

于 2012-07-13T11:10:38.190 に答える