【Python】拡張子別にファイルを整理するプログラム

Pythonで自動化しよう プログラミング

皆さんはPCのファイル整理してますか?え、してない?…まあ、きちんと整理している人なんてほぼいないんじゃないかな。なんたって面倒ですからね。

かくいう私も全く整理などしておりません。「めんどくさい」ことはニートの天敵。やるわけがない。

しかし、そうは言っても散らかりまくったフォルダを見るのはあまり気持ちのいいものではありませんし、そこから必要なファイルを探す必要があるとまた面倒ですよね(ファイルが多いと検索しても時間がかかる)。

特に困るのがダウンロードフォルダで、しばらくすると色々なファイルでぐちゃぐちゃになっちゃいませんか?さっき自分のダウンロードフォルダを見たら、2000個近いファイルがひしめき合っていて「さすがにそろそろ整理しなきゃなぁ…」なんて思うわけですよ。

ただまあ、当然ながらその物量になるとさすがに手動で仕分けるのは面倒すぎます。そこで今回はファイルの整理をプログラミングで自動化することにしました。

スポンサーリンク

Pythonでファイル整理を自動化してみよう

今回は「Python」というプログラミング言語でファイル整理プログラムを実装します。Pythonは初心者にやさしくて、しかも強力な機能を持つ大人気のプログラミング言語です。興味のある方はぜひググってみてください。

ファイル整理プログラムの仕様

さて、それでは今回のプログラムの仕様を確認しておきます。

  • フォルダを指定すると、その中にあるファイルを「拡張子名のフォルダ」に振り分ける。
  • 「拡張子名のフォルダ」がない場合は自動的に作成する。

例:
「text.txt」というファイルは「txt」というフォルダの中に振り分けられる。

単純明快ですね。シンプルにファイルを振り分けるだけのプログラムです。

ソースコード

今回私が書いたソースコードは下記の通りです。

import os
import glob
import shutil
import tkinter
from tkinter import filedialog

print("[拡張子でファイル整理 Ver1.00]")

tk = tkinter.Tk()
tk.withdraw()

iDir = os.path.abspath(os.path.dirname(__file__))
titleText = "整理したいファイルがあるフォルダを選択"
dir = filedialog.askdirectory(title = titleText, initialdir = iDir)

if dir != "":

  print("ファイル整理を開始します。")
  print("...処理中...")

  files = glob.glob(os.path.join(dir, '*.*'), recursive = False)

  for file in files:
  
    #フォルダ名に.が混じったものが含まれる可能性があるので、ファイルかどうかを判定する
    if os.path.isfile(file):
  
      fileName, extention = os.path.splitext(file)	#ファイル名(パス含む)と拡張子に分解
      extention = extention.strip(".")				#.を消去
      childPath = dir + "/" +  extention				#子フォルダのパスを作成
      
      #子フォルダが存在していなければ作成
      if not os.path.isdir(childPath):
        os.mkdir(childPath)
      
      #移動
      shutil.move(file, childPath)

  print("ファイル整理が完了しました。")
  
else:
  print("キャンセルされました。何もせずに終了します。")

処理の解説

使っているモジュール

このプログラムでは次のモジュールを使用しています。

  • os:パスの操作・フォルダ作成用
  • glob:ファイルパス取得用
  • shutil:ファイルの移動用
  • tkinter:ダイアログ表示用

14行目:ダイアログ表示

tkinterのダイアログ表示機能を使い、フォルダ選択ダイアログを表示して処理対象のフォルダを選択してもらいます。

21行目:ファイル一覧の取得

globを使ってファイルの一覧を取得する処理です。先ほどのダイアログで取得したフォルダのパスにワイルドカード「*.*」を付加して、名前にドットの付いたファイル(拡張子含む)のパスを取得してリストに格納します。

ただしこれだとファイルだけでなく「名前にドットの付いたフォルダ」も含まれてしまうので、26行目でそのようなフォルダをスキップするようにしてあります。

28~30行目:振り分け先のフォルダのパスの設定

振り分け先のフォルダのパスを作成します。os.path.splitext()メソッドでファイルのパスから拡張子を抽出できるので、そこからドットを取ったものを振り分け先のフォルダ名として設定します。

32~34行目:振り分け先フォルダの新規作成

振り分け先として設定されたフォルダが存在しなければ新規作成します(ファイルの移動処理を行う機能を使うためには、あらかじめ移動先のフォルダを作っておく必要がある)。

37行目:ファイル移動

shutil.move()メソッドを使ってファイルの移動を行います。以上の処理をファイル数だけ繰り返せば完了です。

面倒なことはPythonにやらせよう

今回作ったプログラムは単純なものでしたが、それでもこのプログラムを使うことでフォルダが非常にすっきりしました。こういうときに「プログラミングを勉強して良かった」としみじみ思います。

身の回りにはまだまだ面倒なルーティンワークがあるので、そういうのもPythonでどんどん自動化できたらいいなと思います。