📝

【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