みなさん、こんにちは。
複数の画像ファイルを撮影された年月のフォルダに移動させるプログラムを作成しようと思います。
プログラムを作成に至った経緯
デジカメで撮影した画像をパソコンに取り入れたのですが、ピクチャのフォルダに大量の全画像が入ってしまいました。
一つのフォルダに大量の画像ファイルが入ってしまったので、撮影した年月のファルダに分けて整理しようと思い、今回のプログラム作成に至りました。
プログラムの内容
作成するプログラムの内容は以下の通りです。
- フォルダ内にあるファイル名”IMG_”から始まるファイルに対して処理を行う
- ファイルが作成された年月のフォルダを作り、ファイルを移動させる
- 年月のフォルダが既にあればフォルダを作成しない
✔ ”IMG_”から始まるファイルに対して処理を行います。
CANONのデジカメで撮影した画像はIMG_から始めるファイル名が付けられるからです。
その為、ファイル形式に対してはチェックしません。
✔ 作成された”年月”でフォルダ作成をします。
例えば2021年6月21日に作成(撮影)された画像であれば、202106のフォルダを作成します。
月の桁数が1桁の場合、0埋めをして2桁にします。
正)2021年6月 ⇒ 202106
✔ 移動するフォルダがあれば作成しません。
当然ですが、移動するフォルダが作成されていれば、新たに作成はしません。
プログラム内に於いて、フォルダの有無の処理を加えます。
使用するライブラリ os、datetime, shutil
「os」、「datetime」、「shutil」はpythonの標準ライブラリなのでインストールする必要はありません。
「os」はフォルダ内のファイル取得、「datetime」はファイルの作成日時の取得、「shutil」はファイル移動の際に使用します。
プログラムコード
では、プログラムコードの説明に入りたいと思います。
import os
import datetime
import shutil
folder_a = 'C:/Labo/a/'
list1 = os.listdir(folder_a)
list2= [s for s in list1 if (("IMG_") in s)]
for f in list2:
img_file = os.path.join(folder_a, f)
img_file_date = datetime.date.fromtimestamp(os.path.getmtime(img_file))
newfolder = f'{folder_a}{img_file_date.year}{img_file_date.month:02}'
if not os.path.exists(newfolder):
os.mkdir(newfolder)
shutil.move(img_file, newfolder)
1~3行目 ライブラリのインポート
import os
import datetime
import shutil
ライブラリをインポートします。
5~7行目 フォルダの定義、ファイルの選別
folder_a = 'C:/Labo/a/'
list1 = os.listdir(folder_a)
list2= [s for s in list1 if (("IMG_") in s)]
folder_a : ファイルが保存されているフォルダを定義します。
list1 : フォルダ内のファイルをos.listdirを使いリスト化します。
list2 : さらに”IMG_“と含まれるファイルをリスト化します。文字が含まれるのを判別する為に、if (“検索文字”) in “文字列”を使います。
9~11行目 ファイルの作成日時をチェックする
for f in list2:
img_file = os.path.join(folder_a, f)
img_file_date = datetime.date.fromtimestamp(os.path.getmtime(img_file))
ファイルの作成日時を確認する為にdatetime.date.fromtimestamp(os.path.getmtime(ファイル名))を使います。
この引数としてファイル名は、パスを含んでいなければならないので、os.path.joinをでパスを追加します。
因みにファイルの更新日時を確認するには、os.pathgetctime()を使用します。
13~15行目 移動するフォルダを作成する
newfolder = f'{folder_a}{img_file_date.year}{img_file_date.month:02}'
if not os.path.exists(newfolder):
os.mkdir(newfolder)
newfolderは移動するフォルダの定義です。フォルダ名はファイルの作成の年月になります。
フォルダ名をf'{}’:フォーマット済み文字列リテラル(f文字列)を使用しています。
{img_file_date.month:02}とすることで、月が1桁の場合には、ゼロ埋めをして2桁にすることが出来ます。
フォルダの有無を調べるにはos.path.existsを使用します。フォルダが無ければ、os.mkdirでフォルダを作成します。
17行目 ファイルの移動
shutil.move(img_file, newfolder)
shutil.move(フルパスのファイル名, 移動先ファルダ)でファイルを移動させます。
以上で完成です。
まとめ
いかがだったでしょうか。
ファイルの作成日時を確認する方法、数値の0埋めする方法、フォーマット済み文字列リテラル(f文字列)について、是非憶えて下さいね。
「役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!
コメント