ファイル内の文字列を(その場で)置換したいことは良くある.
単純にファイルを読み込み置換するだけですむなら良いが、やはりできるだけ安全に行いたい.
perlではよく適当に -i オプションを付けて済ませてしまっていたが、
それはどうやら常軌を逸した行いのようだ.
なので少しは誠意ある振る舞いが出来るよう、
(比較的)安全にファイル内の文字列を置換する方法を考え、コードを残しておく.
ほんとに最低限の事だと思うが、安全さを以下のポイントを抑える事で担保する.
ポイント:
- 一時ファイルに書きだし、それをコピーすることで(その場での)書き込みを行う
- try ~ finally で元ファイルのcloseは確実に行う
これらをまとめ、以下のコード のように置換を行う関数化しておく.
# -*- coding: utf-8 -*-
import os,re,sys
import tempfile
import shutil
def pat_replace(stext,rtext,file):
"""
porpose : ファイル内の文字列を(その場で)置換する
usage : pat_replace("置換前パターン","置換後文字列",'target-file') --> replaced file
* stext は reパターンで渡す必要がある.
"""
tmpfd,tmpname = tempfile.mkstemp(dir='.')
try:
output_file = os.fdopen(tmpfd, 'w')
input_file = open(file)
except IOError:
print '"%s" cannot be opened.' % file
else:
for line in input_file:
a = stext.sub(rtext, line)
output_file.write(a)
finally:
output_file.close()
input_file.close()
shutil.copyfile(tmpname,file)
os.remove(tmpname)