👌

一括ファイル書き換え

2022/04/08に公開

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

Before After

Before:

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

After:

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

背景

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

tree:

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

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

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

Discussion