[解決済み] 追記ではなく、置換・上書きをする
2022-03-02 13:01:59
質問
次のようなコードがあります。
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" が追加されます。つまり、古いコンテンツに続いて新しいコンテンツ "replaced" が追加されます。古いものを削除して、新しいものだけを残すにはどうしたらよいでしょうか?
解決方法は?
必要なのは
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')
を変更します。
ノード
の番号が表示されます(Ubuntu 12.04 の NFS と ext4 で2回テストしました)。
ちなみに、これはPythonとはあまり関係ない話です。インタプリタが対応する低レベルのAPIを呼び出すのです。メソッド
truncate()
は、C言語でも同じように機能します。参照
http://man7.org/linux/man-pages/man2/truncate.2.html
関連
-
Python入門 openを使ったファイルの読み書きの方法
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Vimで文字を改行で置き換える方法
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】__str__と__repr__の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)