久々の更新になってしまいました。
まだまだコロナウィルスが猛威を振るっておりますが、
皆様お変わりないでしょうか。
もう4月になりますが、僕は花粉症なのかハウスダストなのか、
まだくしゃみと鼻水が止まりません。
花粉症のお薬として、今年からクラリチンというものを
使い始めましたが、薬の効果なのか副作用なのか、鼻の粘膜がとても乾燥し、
鼻水は出なくとも鼻がムズムズするのが止まりません。。。
⇒ クラリチン
一方、点鼻薬の「ナザール」はとてもよく効くので、
寝る前とかにプシュッとやっておくと、鼻づまりやくしゃみが解消されて
比較的眠りやすくなりますのでお勧めです。
※薬の効き方には個人差がありますので注意ください。
⇒ ナザール
さてこの度、副業でやっている python プログラミングにて、
特定のファイルを世代バックアップする必要が生じたので、
その時に作成したコードを備忘録として残しておこうと思います。
やりたいことは以下です。
- 特定ファイルを10世代バックアップとして残す
- バックアップファイルの名前にバックアップ取得時の日時を入れる
- 11世代以上の古いファイルは自動的に削除
ファイルを10世代バックアップする Python コード
上記を実施するコードは以下です。
変数名とかは結構適当です。。。
例として以下の場合を想定しています。
- バックアップ対象のファイル名 : config.yml
- バックアップ対象ファイルの格納先フォルダ : C:\Users\RYO\Desktop\dest
- バックアップ先フォルダ : C:\Users\RYO\Desktop\dest
- バックアップ世代数 : 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import os import datetime import glob import shutil resource_filename = "config.yml" resource_directory_path = r"C:\Users\RYO\Desktop\res" backup_directory_path = r"C:\Users\RYO\Desktop\dest" max_file = 10 # バックアップ対象ファイルのフルパスを取得 backup_target_file_full_path = resource_directory_path + "\\" + resource_filename # バックアップファイル名の作成 backup_target_file_base_full_name = os.path.basename(backup_target_file_full_path) # 拡張子ありのファイル名 backup_target_file_base_name = os.path.splitext(backup_target_file_base_full_name)[0] # 拡張子抜きのファイル名 backup_target_file_extension = os.path.splitext(backup_target_file_base_full_name)[1] # 拡張子 # ファイル名に入れるタイムスタンプを取得 now = datetime.datetime.now() filename_timestamp = now.strftime('%Y%m%d%H%M%S') # バックアップファイルのファイル名を作成 backup_file_full_path = backup_directory_path + "\\" + backup_target_file_base_name + "_" + filename_timestamp + backup_target_file_extension # ファイルをバックアップする shutil.copy(backup_target_file_full_path, backup_file_full_path) ### ★★★ 世代管理 ★★★ # バックアップファイル保存先ディレクトリ内の 特定拡張子 (例 *.yml) のファイルリストを取得 file_list = [] file_list = glob.glob(backup_directory_path + "\\" + backup_target_file_base_name + "_*" + backup_target_file_extension) #ファイルの最終更新時刻順にソートする sorted(file_list, key=lambda f: os.stat(f).st_mtime, reverse=True) #上限ファイル数を越えている場合、MAX_FILE 個数超過分を削除する if len(file_list) > int(max_file): del_num = len(file_list) - int(max_file) for i in range(del_num): os.remove(file_list[i]) |
ファイルのコピーなどは shutil というモジュールを使用すれば
簡単に実装することができます。
バックアップファイルの世代管理については、
バックアップファイル格納先フォルダにて、”config_*.yml” のファイル名をもつもののみを
リストで取得し、タイムスタンプ順にソートしています。
その中から、世代上限数を超えた分のファイルを
タイムスタンプが古い順に削除しています。
上記コードを実行すると、バックアップ先ディレクトリに
下図のようにファイルが世代別に保存されていきます。
10世代を超えたものは、順次古いものから削除されていきます。
|
|
最後に
今回のコードを作成するにあたり、以下のページを参考にさせていただきました。
ありがとうございました。
・【Pythonサンプルコード】フォルダ内のファイル名一覧のリストを取得して、更新時刻が古い順にファイルを削除していくコード
以上、参考になれば幸いです。
コメント