perl -pe みたいな行置換をしたい
やりたいこと
ファイル内の文字列の一部だけ置換したいとき、コマンドでは sed か perl のワンライナーが使えるが、
同じことを Python のスクリプト内で実行したい。
bash
perl -pe 's/aaa/bbb/g' -i.bk a.txt
または
bash
sed -i.bk 's/aaa/bbb/g' a.txt
その際の悩みとして、
- このためだけに、わざわざ外部コマンド (sed, perl) を呼ぶのは非効率
- だからといって、ファイル開いて置換するのはミスりそうで嫌だ(後から読んだときもたぶん不安になる)
というのがある。
対応
Python には fileinput という便利なモジュールが標準ライブラリに含まれている。
py
import fileinput
with fileinput.input('a.txt', inplace=True, backup='.bk') as f:
for line in f:
print(line.replace('aaa', 'bbb'), end='')
これだけで良い。
注意点として、
- 改行を含めてしまうと改行が毎行余分に出るので、
end=''で改行なし出力にしている。 - ファイルに変更なくてもタイムスタンプは更新される(perl, sed と同じではあるが)
参考(とか書いたが、本来の使い方はこっちか)
- ファイルを指定しなければ、標準入力から読む
- つまりフィルタコマンドのようなものを書きたいときに便利
py
for line in fileinput.input():
print(...)
以下広告