Pythonで一括ファイル書き換え

📕 新コースを公開しました。→クーポン掲載ページ

一括でファイルを変更したくなったので、簡単なコードをメモ代わりに残しておきます。

Before

それほどよく変更するものではないので、手動でそれぞれのファイルを変更していました。

After

もう嫌になってしまったので…プログラムで解決。

背景

コース用に公開しているGithubリポジトリで、コースの内容に応じてセクションごとにディレクトリを作っている状態です(コース用なので特殊な構成です)。

Github Repo
├── requirements.txt  # 大元のファイル
├── ...
├── sec01
│   ├── hoge
│   │   ├── requirements.txt  # 大元のファイル内容に合わせたいファイル
│   │   └── ...
├── sec02
│   ├── hoge
│   │   ├── requirements.txt  # 大元のファイル内容に合わせたいファイル
│   │   └── ...

...

└── sec15
    └── hoge
        ├── requirements.txt  # 大元のファイル内容に合わせたいファイル
        └── ...

こんな状態なので、Pillowのバージョンアラートなんかが発生した際にrequirements.txtの中身を書き換える必要があったのです。Pillowのバージョンアラートが比較的頻繁に発生してたので、手動も大変だと思い、プログラムで変更しようとした次第です。

プログラム

まずルートのrequirements.txtのパスを取得します。

from pathlib import Path

BASE_DIR = Path().cwd()
BASE_FILE_PATH = BASE_DIR / 'requirements.txt'
print(BASE_FILE_PATH)

続いて、各セクションフォルダ内のrequirements.txtまでのパスを取得します。

# globを使って条件指定で検索
# sec* == secで始まるフォルダを指定しています。
# いきなりforにつかうなら不要ですが、ここでは表示のために一旦リスト型にしています。
ALL_FILE_PATHES = list(BASE_DIR.glob('sec*/hoge/requirements.txt'))
print(ALL_FILE_PATHES)

ALL_FILE_PATHES にしっかりそれぞれのファイルまでのパスが入っていることが確認できたなら、あとは実際に内容を書き換えるだけです。

💡 ただし、ここからは実際に上書きしてしまうので、上書きしても問題ないのかどうかは事前にご確認ください。

# まず大元のファイル内容をcontent変数へ格納しておきます。
with open(BASE_FILE_PATH, 'r') as f:
    content = f.read()

# forで各パスに対して処理します。
for path in ALL_FILE_PATHES:
    # 各ファイルを、大元のファイル内容で上書きします。
    with open(path, 'w') as f:
        f.write(content)

以上のプログラムを実行すると、変更が確認できると思います。

パスのところを皆さんの内容に置き換えれば、一括上書きするプログラムとしてお使いいただけると思います!

🎓✍️コース一覧

プログラミング関係のビデオコースを提供しています。クーポンも発行していますので、ぜひ一度チェックしてみてください。

Twitter @takumafujimoto

記事を読んでいただきありがとうございます。ツイッターではプログラミング以外についてや、たまにクーポン情報もツイートしたり。。。ツイッターでもお待ちしてます。