Pythonでダウンロードフォルダの整理をGUIでする方法

最近Pythonを触りはじめた私だ。そんな私が、ダウンロードフォルダの整理を自動でしたかったので、Pythonでプログラムを書いてみた。四苦八苦しつつ無事完成。GUIにも挑戦したので、GUIでダウンロードフォルダを整理できるようになった。

どのようにダウンロードフォルダを整理するか

今回は、ファイルの種類に従ってダウンロードフォルダを整理する。私が作成したPythonプログラムでは下記のようにフォルダを分類した。

  • document(pdf,txt,xlsx,xls,csv,docx)
  • exe(exe,msi)
  • folder(フォルダー)
  • images(png,gif,jpg,svg,jpeg,ico)
  • movie(mp4,avi,wmv)
  • music(mp3,m4a,aac,flac)
  • other(その他ファイル)

バラバラだったファイルやフォルダが上記7つのフォルダに収まるというわけだ。

実際のGUI画面

Select file extension to delete」で、削除したい圧縮ファイルの種類を指定する。

「Download folder path」で、ダウンロードフォルダを「Directory Browse」ボタンから選択する。

「Start」ボタンで処理を実行する。「Exit」で終わる。

ダウンロード

とにかくダウンロードフォルダを整理したいだけなんだという方にむけて、Pythonで作ったダウンロードフォルダの整理プログラムをexe形式で公開している。免責として、作者である私がこのプログラムを使った損害などを負うことはないので使用の際はご注意願いたい。

DOWNLOAD LINK:organize_download_folders|Google Drive

Pythonでダウンロードフォルダの整理をする実際のコード

実際のPythonでのコードをここにご紹介する。勢いで書いたので、クラス名や変数名・ファイル名が適当だったり不適切だったりすると思う。申し訳ない。

実際にフォルダー分けをする部分|test.py

GUI部分|untitled.py , dialog.py

GUI部分とフォルダー分けをする部分を呼び出して実行する部分|organize_download_folders.py

解説

実際にフォルダー分けをする部分|test.py

実際にフォルダー分けをする部分である「test.py」の解説をする。ここでは、指定されたダウンロードパスの中にあるファイルやフォルダを、作成するフォルダに移動させ整理させる。

9-20行目

変数の宣言。ダウンロードパスを入れるための変数の宣言。ディレクトリの名前を設定している。圧縮ファイルの拡張子の変数に0を代入している。これは、GUIでチェックボックスにチェックが入った時に1となるようにするためだ。

23-30行目

delete_fileメソッドの定義。ここでは、GUIのチェックボックスでチェックした圧縮ファイルの拡張子がファイル名にあるものだけを削除する処理が書かれている。toggleつまり圧縮ファイルの拡張子の変数(self.zipなど)が1の場合にその拡張子のファイルは削除される。

32-35行目

randomnameメソッドの定義。ここでは、仮に作成するフォルダの名前の頭につけるランダムな文字列を生成するための処理が書かれている。

LINK:Pythonを使ってランダムな文字列を生成

36-39行目

move_filesメソッドの定義。ここでは、ディレクトリではないファイルのみを移動させるための処理が書かれている。ファイルはランダムな文字列が頭についたフォルダに移動される。

41-行目

mainメソッドでは、このクラスにおけるメインの処理を書いていく。引数として、GUIからの値を読み込んでいる。

43-46行目

GUIから渡ってきた値を、このクラスのプロパティに代入している。

48-50行目

GUIのチェックボックスでチェックされた圧縮ファイルの拡張子のついたファイルを削除する処理を走らせる。

52-60行目

作成するディレクトリ名をリストにする。

62-66行目

仮のディレクトリを作成する。仮のディレクトリ名は、ランダムな12文字の文字列に設定したディレクトリ名。まず存在しない名前のディレクトリを作成することで、間違ったフォルダを移動させないようにする

68-79行目

globと正規表現を用いて、各拡張子に一致するファイルを検索し変数へ代入する。それらを、作成した仮の各ディレクトリへ移動させる。

LINK:サルにもわかる正規表現入門

LINK:正規表現で文字列を含まない、否定の記述 | UX MILK

81-84行目

68-79行目で検索されなかったディレクトリを除いたファイルのみを検索し変数へ代入。それらを、otherフォルダに移動。

85-94行目

ディレクトリを移動させる処理。作成した仮のディレクトリまで移動させないように分岐させる。Windowsの場合、パスを区切る文字が一般のものと異なるので、replaceで整える。

96-103行目

仮のディレクトリから正規のディレクトリへ移動させ、仮のディレクトリを削除する処理。まず、正規のディレクトリがなければ作成する。そして、仮のディレクトリの中身を正規のディレクトリへ移動。仮のディレクトリを削除。

この処理が必要なのは、os.moveでは、同じパスのディレクトリのコピーはエラーになるからだ。もしかするとエラーにならない関数があるのかもしれないが、私は知らないので代替策をとった。

GUI部分 |untitled.py , dialog.py

GUIはPyQt5Qt Designerを用いて作成した。したがって上記でご紹介したコードはGUIツールを使って設定したものから自動的に生成されたものだ。

LINK:[Python]Qt Designer簡単に使い方。 – Qiita

LINK:PyQt5とpython3によるGUIプログラミング[6] – Qiita

GUI部分とフォルダー分けをする部分を呼び出して実行する部分 |organize_download_folders.py

「organize_download_folders.py」は、実際に処理を一番始めに走らせるファイルだ。つまり、CUIなら「python
organize_download_folders.py 」として処理を実行する。

1-9行目

必要なファイルをインポートしている。特に6-8行目では、作成した3つのPythonファイルを忘れずにインポートしている。

10-21行目

ダイアログボックスを表示させるための処理。ダイアログが表示させた後、それを閉じるためのボタンを押した際にdialog_closeメソッドを呼び出すように設定している。dialog_closeメソッドでは、ダイアログを閉じるための処理が書かれている。dialog_changeメソッドでは、ダイアログに表示する文字を変更するための処理が書かれている。

25-41行目

メインのGUIウィンドウを表示させるための処理。まず、28-31行目でtest.pyのmainメソッドへ渡すための変数の宣言を行っている。33,34行目でQt Designerで作成したuntitled.pyのクラスとメソッドを呼び出している。36-41行目で各ボタンのトリガーを設定している。

44-56行目

startボタンをクリックしたとき、つまり、test.pyのmainメソッドを走らせるときの処理。もし、ダウンロードパスがGUIで設定されていなかったら、ダイアログでその旨を表示する。もし、mainメソッドの処理が終わったら、その旨をダイアログで表示する。

58-61行目

ダウンロードパスを設定するためのボタンを押したときの処理。ディレクトリを選択するためのダイアログを表示させる。そこで設定したパスは、ボタン上部のテキストボックスに代入され、test.pyのmainメソッドで利用される。

63-77行目

各ファイルの拡張子のチェックボックスにチェックが入っていたら、その変数に1を代入する。その変数は、test.pyのmainメソッドで利用される。

80-84行目

PyQt5を使うときの定型文。上記で設定したクラスAppを変数windowに代入し、show()で表示。

まとめ

小さなものだがダウンロードフォルダをすっきりさせるための良いプログラムを作れたと思った。Python楽しい。

共有する

このエントリーをはてなブックマークに追加

コメントをする

メールアドレスが公開されることはありません。
*のついている項目は必須です。


*