📝
【Python】毎回設定ファイルを書き換えるの、そろそろやめませんか?自動置換スクリプトを紹介
😄 概要
このスクリプトは、
・設定ファイルのバックアップを作成
・特定の設定項目を自動的に置換・更新
ができるスクリプトです。
以下の経験が多いならおすすめかも
・毎回インストール時に設定の値を変えないといけない・・・・
・ループバックのIP[127.0.0.1]を毎回直さないといけない・・・
・ディレクトリの設定を毎回直さないといけない・・・
コード
import os
import shutil
from datetime import datetime
# 編集対象ファイルのパス
# ここで書き換えたい設定ファイル(.confなど)を指定します
file_path = "./system.conf"
# バックアップファイルのパス
# タイムスタンプを付与することで、毎回異なるバックアップファイルが作成されます
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"./backup_system_{timestamp}.conf"
# 置換内容リスト
# それぞれ (置換前の文字列, 置換後の文字列) のタプルで指定します
# 必要なだけ追加・編集できます
config_changes = [
("server_ip = 192.168.0.10", "server_ip = 10.0.0.5"), # サーバIPアドレスの変更
("user_id = admin", "user_id = test_user"), # ユーザーIDの変更
("password = admin123", "password = testpass456"), # パスワードの変更
("connection_type = ssh", "connection_type = https"), # 接続方式の変更
("port = 22", "port = 443"), # ポート番号の変更
("timeout = 10", "timeout = 30"), # タイムアウト値の変更
("log_output = console", "log_output = file"), # ログ出力先の変更
("retry_count = 3", "retry_count = 5"), # リトライ回数の変更
("env = development", "env = production"), # 環境設定の変更
("enable_ssl = false", "enable_ssl = true"), # SSL有効化の変更
]
# ファイルが存在するかチェック
if os.path.exists(file_path):
# 編集前のファイルをバックアップ
# 失敗時は例外が発生します
shutil.copy2(file_path, backup_path)
print(f"バックアップを {backup_path} に作成しました。")
# 一時ファイルのパス(書き換え後の内容を一旦ここに書き出します)
tmp_path = file_path + ".tmp"
replaced = False # 1つでも置換が発生したかどうかのフラグ
# ファイルを1行ずつ読み込み、置換リストに従って内容を書き換えます
with open(file_path, "r", encoding="utf-8") as fin, open(tmp_path, "w", encoding="utf-8") as fout:
for line in fin:
original_line = line # 置換前の行を保持(デバッグや比較用)
# すべての置換ペアについて順に置換を試みる
for before, after in config_changes:
if before in line:
# 置換対象が見つかった場合、内容を置き換え
line = line.replace(before, after)
replaced = True # 置換が発生したことを記録
fout.write(line) # 置換後(またはそのまま)の行を書き込み
# 一時ファイルで上書き
shutil.move(tmp_path, file_path)
# 置換が発生したかどうかでメッセージを分岐
if replaced:
print(f"{file_path} の内容を置換しました。")
else:
print(f"{file_path} に置換対象が見つかりませんでした。")
else:
# 編集対象ファイルが存在しない場合のエラーメッセージ
print(f"{file_path} が存在しません。")
実行例
$ cat system.conf
server_ip = 192.168.0.10
user_id = admin
password = admin123
connection_type = ssh
port = 22
timeout = 10
log_output = console
retry_count = 3
env = development
enable_ssl = false
$
$ python file_sed.py
バックアップを ./backup_system_20250604_214914.conf に作成しました。
./system.conf の内容を置換しました。
$
$ cat system.conf
server_ip = 10.0.0.5
user_id = test_user
password = testpass456
connection_type = https
port = 443
timeout = 30
log_output = file
retry_count = 5
env = production
enable_ssl = true
⚙️ 機能説明
・対象ファイルの指定
file_path = "./system.conf"
編集対象となる設定ファイルを指定します。
・バックアップの作成
shutil.copy2() を使用して、現在の設定ファイルを backup_system_YYYYMMDD_HHMMSS.conf という形式でバックアップします。
・置換リストの定義
config_changes で設定項目の置換内容をリストで定義します。
例:IP、ユーザー、パスワード、ポート番号など。
・設定ファイルの行単位読み込み&置換
各行に対して config_changes のペア(置換前・置換後)を順に適用します。
・一時ファイルに書き出し
置換した結果は .tmp ファイルに書き出されます。
・元のファイルを更新
shutil.move() により .tmp を元ファイルとして上書きします。
・メッセージ出力
置換が発生したかどうかに応じて、ユーザーにメッセージを表示します。
💡特徴
安全性:編集前に必ずバックアップを作成。
柔軟性:config_changes に複数の設定項目を定義できる。
可搬性:特定のOSや環境に依存せず動作可能。
補足
リストに存在しない文字列は置換されない。
完全一致する言葉じゃないと置換されない。
Discussion