はじめに
今回はPythonのshutilを使ってファイル整理をするプログラムを作りました。
今回のプログラムではPDFに縛っていますが応用次第で他の種類のファイルを整理することもできるので、ぜひいろいろなことに応用してもらいたいです。
実行環境
- Python 3.11
- Windows 10
使用ライブラリ
- shutil
- datetime
- tkinter
- tkinter.messagebox
- tkinter.ttk
このプログラムでは外部ライブラリは使用していないのでpipでのインストールは必要ありません。
実装の準備
まず、sort_pdfs.pyとか適当な名前のファイルを作成してください。
次に整理したいPDFファイルを.pyファイルと同じフォルダに配置してください。
ファイルが消える可能性もあるので一応消えたらまずいファイルなどはコピーしてください。
実装
以下のコードを先程作成した.pyファイルにコピペしてください。
実行すると「年」「月」「日」のフォルダが作成され、そこに配置したPDFファイルがフォルダ分けされます。
コード全文
import os
import shutil
from datetime import datetime
import tkinter as tk # tkinterをインポート
from tkinter import messagebox, ttk # メッセージボックスとプログレスバーをインポート
# プログレスバーを含むウィンドウを作成
def create_progress_window(total_files):
# tkinterのルートウィンドウを作成
root = tk.Tk()
root.title("PDF整理中")
root.geometry("300x100") # ウィンドウのサイズを指定
# プログレスバーの作成
progress_bar = ttk.Progressbar(root, orient="horizontal", length=250, mode="determinate")
progress_bar.pack(pady=20)
# プログレスバーの最大値を設定
progress_bar["maximum"] = total_files
return root, progress_bar
# 整理したいフォルダのパスを指定
source_folder = os.getcwd() # 実行されたフォルダを取得
# フォルダ内のファイルを取得
files = os.listdir(source_folder)
# PDFファイルのみを対象としたリストを作成
pdf_files = [file_name for file_name in files if file_name.lower().endswith('.pdf')]
# プログレスバーのウィンドウを作成
root, progress_bar = create_progress_window(len(pdf_files))
# PDFファイルの整理を行う
for file_name in pdf_files:
print("Processing:", file_name) # 現在処理中のファイル名を表示
# ファイルのフルパス
file_path = os.path.join(source_folder, file_name)
# ファイルが存在しない場合はスキップ(フォルダが混じっている場合など)
if not os.path.isfile(file_path):
progress_bar["value"] += 1 # プログレスバーを更新
root.update() # ウィンドウを更新
continue
# ファイルの更新日を取得
modification_time = os.path.getmtime(file_path)
modification_date = datetime.fromtimestamp(modification_time)
# フォルダ名を「%Y年/%m月/%d日」形式で作成
year_folder = os.path.join(source_folder, modification_date.strftime('%Y年'))
month_folder = os.path.join(year_folder, modification_date.strftime('%m月'))
day_folder = os.path.join(month_folder, modification_date.strftime('%d日'))
# 日付ごとのフォルダを作成(存在しない場合)
os.makedirs(day_folder, exist_ok=True)
# ファイルを日付フォルダに移動
shutil.move(file_path, os.path.join(day_folder, file_name))
# プログレスバーを更新
progress_bar["value"] += 1
root.update() # ウィンドウを更新
# 完了メッセージをメッセージボックスで表示
messagebox.showinfo("完了", "PDFファイルのフォルダ分けが完了しました!")
# tkinterを終了
root.destroy()
応用
以下の部分のendswith('.pdf')
の.pdfを整理したいファイルの拡張子にすることで他の種類のファイルもこのプログラムで整理することができます。
# PDFファイルのみを対象としたリストを作成
pdf_files = [file_name for file_name in files if file_name.lower().endswith('.pdf')]
また、以下のように拡張子リストを用いると複数の拡張子のファイルをフォルダ分けすることができます。
file_extensions = ['.pdf', '.jpg', '.png']
pdf_files = [file_name for file_name in files if file_name.lower().endswith(tuple(file_extensions))]
おわりに
今回はファイルをフォルダ分けするプログラムを作ってみました。
こちらの記事がなにかの役に立つと嬉しいです。