![見出し画像](https://assets.st-note.com/production/uploads/images/52870895/rectangle_large_type_2_883ff7d2836f1b6833533c4bff591d47.png?width=800)
複数の置換作業を一括で行うマクロをPythonで実施する
エディタやOfficeツールなどの一括置換。便利ですよね。一方で便利すぎるこの機能を使いこなしていても、新たな問題にぶち当たります。
毎回手動で置換作業をしているが面倒になってきた
数が多すぎて指が痛い
この記事は上記のような悩みを抱える方向けにPythonでほんの少しラクを使用という目的から生まれました。
実現できればなんでもよくてググったら先人の英知(ほぼコピペで再利用可能なありがたいもの)があるのではと考えました。そして見つけた記事(元ネタ)は以下です。
・・・なるほど(VBAよく)わからん!!!
という方向けにPythonで同様の処理を実現するに至りました。
そして(超個人的な理由で)CSV や Excel内の値を一括置換するより、文章ファイルを一括置換したかったので元ネタ記事とは若干異なるものです。
やること
![画像3](https://assets.st-note.com/production/uploads/images/52870165/picture_pc_8e6de0b123a75d3ddd04ca77d1f6288d.png?width=800)
用意するもの
read.txt ・・・置換前の文章
pattern.csv ・・・置換パターンを記載
config.json ・・・PATHとかを読み込んでいるだけ
手順
1. 置換前の文章を用意する(read.txtに上書きしておく)
2. 置換後の文章を上書きする write.txt を作成(無ければ新規作成)
3. pattern.csvに置換したいパターンを記載しておく
4. CSVを読み込んでbefore → afterへ置換+上書きを繰り返す
pattern.csv
CSVファイルですが、Excelのように開いて編集を想定。
![画像3](https://assets.st-note.com/production/uploads/images/52870235/picture_pc_d81a2d4494de43c9074a0c14ce748090.png)
beforeのワードを正規表現を記載しておけば、一括で変換させることが可能です。便利(これはエディタでもExcelでもできますが)。
コード
import os
import re
import json
import pandas as pd
PATH = os.getcwd()
CONFIG = PATH + "\config.json"
def main():
with open(CONFIG, 'r', encoding='utf-8') as f:
json_load = json.load(f)
READ_FILE = json_load['path']['readFile']
WRITE_FILE = json_load['path']['writeFile']
PATTERN_FILE = json_load['path']['patternFile']
txt = read_text(READ_FILE)
create_text(WRITE_FILE, txt)
load_csv(WRITE_FILE, PATTERN_FILE)
result = read_text(WRITE_FILE)
print(result)
def read_text(PATH):
with open(PATH, 'r+', encoding="utf-8") as f:
txt = f.read()
return txt
def create_text(WRITE_FILE, txt):
with open(WRITE_FILE, mode='w', encoding="utf-8") as ct:
ct.write(txt)
def overwrite_text(WRITE_FILE, replaced_text):
with open(WRITE_FILE, mode='w', encoding="utf-8") as ot:
ot.write(replaced_text)
def load_csv(WRITE_FILE, PATTERN_FILE):
df = pd.read_csv(PATTERN_FILE)
for i in range(len(df)):
new_txt = read_text(WRITE_FILE)
before = df['before'][i]
after = df['after'][i]
replaced_text = re.sub(before, after, new_txt)
overwrite_text(WRITE_FILE, replaced_text)
if __name__ == "__main__":
main()
留意点
CSVファイルに用意する置換パターンくは上から順に実施されます。
そのため、例えば「MA」を「マーケティング・オートメーション」と置換するパターンを用意した際に、置換対象の文章内に「MACアドレス」というワードがあれば、「マーケティング・オートメーションCアドレス」という強そうなアドレスに変換されてしまいます。
そのことから、
- 文字数が多い順にパターン配置する
- 4文字以上 (or) 頻度の少ない3文字以上の文字列に留める
(この辺は個人的な理由でいくつか工夫をしてたりします)
・・・もっと良いやり方が絶対にあるはずで、この記事もおいおいアップデートしていきたいと思っています。
この記事が気に入ったらサポートをしてみませんか?