MENU

大量の写真をPythonで年月ごとにフォルダを作って格納する

あわせて読みたい
大量の写真をバッチファイルで年月ごとにフォルダを作って格納する 皆さんはデジカメやスマホで撮影した写真をどこに保存していますか? 私はデジカメで撮った写真はすべてPCに保存していますが、ここで一つ悩みがあります。 大量の写真...

先日Windowsのバッチファイルでも同じ内容の記事を書きましたが、今回はPythonを用いて年月ごとにフォルダを作って写真を格納する方法をご紹介します。

皆さんはデジカメやスマホで撮影した写真をどこに保存していますか?

私はデジカメで撮った写真はすべてPCに保存していますが、ここで一つ悩みがあります。

大量の写真を一つのフォルダーに入れてしまうと、写真の管理がしづらいことです。

例えば「2024年の4月に撮った写真を見返したい」といったときに、一つのフォルダーにまとめて保存していると探すのが大変なことがあります。

↓一つのフォルダーにまとめて写真を保存した場合(わかりやすくするために日付を書いてます。)

任意のフォルダ
├ DCS_0195.jpg(2023年12月に撮影)
├ DCS_0196.jpg(2023年12月に撮影)
├ DCS_0197.jpg(2023年12月に撮影)
├ DCS_0198.jpg(2024年04月に撮影)DCS_0199.jpg(2024年04月に撮影)
├ DCS_0200.jpg(2024年07月に撮影)
├ DCS_0201.jpg(2024年07月に撮影)

このように写真が溢れかえってしまい探しずらい状態に。これが何百枚もあると尚更大変になります。

そこで撮影した写真の「年」と「月」ごとにフォルダーを作って、写真を格納していけば綺麗に整理ができます。

↓年と月のフォルダーを作って写真を振り分った場合

任意のフォルダ
├ 2023
│ └ 12
│   ├ DCS_0195.jpg(2023年12月に撮影)
│   ├ DCS_0196.jpg(2023年12月に撮影)
│   └ DCS_0197.jpg(2023年12月に撮影)
└ 2024
  ├ 04
  │ ├ DCS_0198.jpg(2024年04月に撮影)
  │ └ DCS_0199.jpg(2024年04月に撮影)
  └ 07
    ├ DCS_0200.jpg(2024年07月に撮影)
    └ DCS_0201.jpg(2024年07月に撮影)

これらを手作業でやろうと思うと面倒くさいので、今回はPythonを用いてまとめて年と月のフォルダを作って写真を格納してみました。

目次

年と月のフォルダを作って写真を格納するコード

実際に作ったコードがこちらです↓

from pathlib import Path
from tkinter import Tk, filedialog
import sys
import re
from datetime import datetime
import shutil

# カレントディレクトリのパスを設定
defaultPath = Path(__file__).parent

# フォルダ選択ダイアログを表示する
root = Tk()
root.withdraw()
search_dir = filedialog.askdirectory(initialdir=defaultPath, title='振り分けたいフォルダを選択してください')
root.destroy()

# フォルダを選択しなかった場合は処理を中断する
if search_dir == '':
    print('フォルダが選択されなかったため終了します。')
    sys.exit()

# 選択したフォルダのパスをstring型からpathlib型に変換
search_dir = Path(search_dir)

# 拡張子を正規表現で限定する
pattern = '\.(jpg|jpeg|png|gif|tif)$'

# ファイルを1つずつ年月フォルダに振り分けていく
for i in search_dir.iterdir():
    if re.search(pattern, i.suffix, re.IGNORECASE):
        # ファイルの更新日の年と月を取得
        ts = i.stat().st_mtime
        year = datetime.fromtimestamp(ts).strftime('%Y')
        month = datetime.fromtimestamp(ts).strftime('%m')

        # 「選択したフォルダ / 年 / 月」のフォルダを作成
        ex_dir = search_dir / year / month
        ex_dir.mkdir(exist_ok=True, parents=True)

        #作成したフォルダにファイルを移動
        shutil.move(i, ex_dir / i.name)
        print('ファイルを移動しました。')
        print(f'移動前: {i}')
        print(f'移動後: {ex_dir / i.name}\n')

実際に使ってみる

先ほどのコードを実行すると、どこのフォルダを整理するかを尋ねるダイアログが出現します。

試しに、今回はこのフォルダーの写真を整理してみたいと思います。

写真は「Pexels」さんからお借りしました。

フォルダーを選択すると、自動で「年」と「月」のフォルダーを作成して、そのフォルダーの中に写真が格納されました。

「2024」のフォルダーを開くと4月と7月のフォルダーが作られ、その中に写真が格納されています。

これで、大量の写真でもすぐに目的の写真に辿り着けるようになりました!

写真以外のファイルに使用する

ちなみにこのコードは写真以外のファイル(エクセルやPDFなど)でも機能します。

他のファイルを振り分けたい場合は、26行目の拡張子名を変更してください。

[PDFだけの場合]
pattern = ‘\.pdf$’

[ワード、エクセル、パワーポイントに限定する場合]
pattern = ‘\.(docx|xlsx|pptx)$’

日付の参照を更新日以外にしたい場合

このバッチファイルでは画像ファイルの「更新日時」を参照していますが、32行目を少し変更すると「作成日時」や「アクセス日時」から参照することもできます。

[作成日時を参照する場合]
ts = i.stat().st_ctime

[更新日時を参照する場合]
ts = i.stat().st_mtime

[アクセス日時を参照する場合]
ts = i.stat().st_atime

目次