Skip to main content

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

以下広告