Make it possible with Python.

最近Pythonから離れ気味、その他物作りに寄り気味です。

ファイル名、ファイル内テキスト一括置換スクリプト 2 (Python2/3対応, その他改善版)

過去に作ったテキスト置換スクリプトを、手直ししました。

過去スクリプト:ファイル名とファイル内テキストを置換するpythonスクリプト - Make it possible with Python.

photo by Mathias L.

このスクリプトは、ファイル名、拡張子の指定条件に一致する複数のテキストファイルのファイル名と内容の一括置換してくれます。

今回改善した点は以下です。

  • Python3 / 2.7 両対応(のはず)
  • 文字コードをShift-JISから、Windows用Shift-JISコードであるcp932に変更
  • 出力ファイルが元ファイルと混在しないよう、リネームファイルは新規フォルダ内に生成
  • 出力ファイル上書き防止のため、同一ファイル名作成時にはエラーと、ファイル名先頭にduplicatedを付与
  • .iniファイルに条件、置換文字列を記載(exeにして配布時のため)

いままでは特定の条件で出力ファイルが空になったりして、人には勧められませんでしたが、これで実用になるのではと思います。

コードはこちら。

まず本体。

# coding: UTF-8
#import sys
#import os
import re
#文字コード指定に必要
import codecs, os
import glob
import configparser

#inifileの内容を読み込み
inifile = configparser.SafeConfigParser()
inifile.read("./config.ini")

#結果を入れるディレクトリ作成
if not os.path.exists("results"):
  os.makedirs("results")  # 再帰的作成

#読み込むファイルの条件を指定
r_fname1 = inifile.get("config","extension")
r_fname2 = inifile.get("config","name")

#置換文字列を指定
name_old = inifile.get("config","name_old") #この文字を含むファイルを操作+ファイル名の置換元文字列
name_new = inifile.get("config","name_new") #ファイル名の置換後文字列
txt_old = inifile.get("config","txt_old") #ファイル内の置換元 文字列
txt_new = inifile.get("config","txt_new") #ファイル内の置換後文字列

#正規表現のコンパイル
txt = re.compile(r_fname2)
fname_o = re.compile(name_old)

#スクリプト配置フォルダのファイル一覧取得
files = glob.glob("*." + r_fname1)

for file in files:
  
    #まずファイル名に指定文字を含むファイルのみ読込
    if txt.search(file):
        # replacedフォルダに、結果ファイル生成
        if fname_o.search(file):
            file_new = file.replace(name_old,name_new)
            
        else:
            file_new = file
                
        read_file = codecs.open(file, 'r', 'cp932')
        
        if not os.path.exists("results//" + file_new):
            write_file = codecs.open('results//' + file_new, 'w', 'cp932')
        else:
            print("There is a duplicated file: " + file_new)
            write_file = codecs.open('results//_duplicated_' + file_new, 'w', 'cp932')

        lines = read_file.readlines() #読み込み
        lines2 = []
        for line in lines:
            line = line.replace(txt_old,txt_new) #テキスト置換
            lines2.append(line) #別リストにする
        else:
            write_file.write(''.join(lines2)) #書き込み
            read_file.close()
            write_file.close()
    else:
        #ファイル内に該当の文字がない場合、変更しない。
        
        pass

そして config.ini ファイル。

extension と name が処理対象ファイル指定条件で、それ以下が 置換文字列の指定になります。

[config]



#処理対象ファイルの拡張子
#同一フォルダ内に、この拡張子を見つけたらすべて読み込みます。

extension   =   txt



#処理対象ファイルのファイル名に共通で含まれる文字。パラメータなど半角 もたぶん指定可能
#指定不要なら拡張子など必ず含まれる文字を入れておく

name        =   txt


#ファイル名の置き換え対象文字列(name_old)と、置き換え後文字列(name_new)

name_old    =   新しい
name_new    =   古い


#ファイル内テキストの置き換え対象文字列(txt_old)と、置き換え後文字列(txt_new)

txt_old     =   です。
txt_new     =   にゃん。