PythonでGrep置換を繰り返し実行するプログラムをつくってみた

#python #grep

テキストエディタのGrep置換では、複数のファイルに対して一つずつしか置換を実行できないため、複数のファイルに対して複数の文言置換を繰り返し実行するプログラムを書いてみました。

●ソースコード

import re
import os
target_dir_path = input("置換対象が格納されているディレクトリをフルパスで指定してください:")
replace_text_file = input("置換前と置換後のテキストがタブ区切りで定義されているファイルを指定してください:")
target_dir_path = target_dir_path.replace('"','')
replace_text_file = replace_text_file.replace('"','')

def replaceText(target_dir_path,replace_text_file):
   for current_dir, sub_dirs, files_list in os.walk(target_dir_path):
       for file_name in files_list:
           print(os.path.join(current_dir,file_name))
           with open(os.path.join(current_dir,file_name),encoding="utf-8") as reader:
               data_lines = reader.read()
               
               # 文字列置換
               with open(replace_text_file,encoding="utf-8") as f:
                   for replace_texts in f:
                       replace_texts = replace_texts.strip().split('\t')
                       if len(replace_texts) == 1:
                         replace_texts.append("")

                       before_text = replace_texts[0]
                       after_text = replace_texts[1]
                       data_lines = re.sub(before_text, after_text, data_lines)

           # 同じファイル名で保存
           with open(os.path.join(current_dir,file_name),encoding="utf-8",mode="w") as writer:
               writer.write(data_lines)

replaceText(target_dir_path,replace_text_file)

●準備

・pythonを実行できる環境を用意。
・上記のソースを任意のファイル名で保存。(例:replace.py)
・置換前後の文言をタブ区切りで記述したテキストファイルを用意。
※Excelで置換前後の文言を並べてからコピーすると楽に用意できます。
(例:replaceText.txt)

タブ区切り

"りんご"を"バナナ"に、"とまと"を"スイカ"に複数ファイルに対して一括置換したい場合のタブ区切り設定ファイルイメージ。

●使い方

①replace.pyを実行。
②置換したいファイルが格納されているディレクトリをフルパスで指定。
例:C:\tool\replace\target
③置換前と置換後のテキストがタブ区切りで定義されているファイルをフルパスで指定。
例:C:\tool\replace\replace.txt
④Enterを押してGrep置換一括実行。

●プログラム実行イメージ

プログラム実行

target1.txtとtarget2.txtが同時に複数

●注意点

・タブ区切りのテキストは文字コードをutf-8としておく。
・置換前後の文言をタブ区切りで指定しているため、置換前の文言や置換後の文言にタブが含まれている場合は正しく機能しません。
※プログラム18行目の'\t'の記述を変更することで区切り文字をタブ以外に指定することができます。(カンマ区切りの場合は、'\t'を','に変更するなど)

replace_texts = replace_texts.strip().split('\t')



この記事が気に入ったらサポートをしてみませんか?