PCをよく使う人なら、定期的に特定の不要ファイルを削除したいという場面があることだろう。それらは、アプリが作るバックアップファイルであったり、キャッシュファイルの類が多いだろう。そこで、これらのファイルを定期的に削除するツールを自作してみよう。自作ツールにしておけば、細かいカスタマイズ設定ができる。
Pythonで特定のファイルを削除する方法
それでは、ツールを作る前に、Pythonで特定のファイルを削除する方法を確認しておこう。ファイルやフォルダを削除するモジュールは、標準モジュールの一つである『os』だ。
ファイルを削除するのが『os.remove(ファイルパス)』だ。例えば『/path/to/test.txt』を削除するプログラムは、次のようになる。
import os
os.remove("/path/to/test.txt")
ちなみに、『os.unlink(ファイルパス)』でも同じだ。
【Windowsの場合の注意】
ところで、Windowsの場合、Pythonのプログラム中にファイルパスを記述する場合、注意が必要となる。と言うのも、Windowsのパスの区切り記号の『¥』は、Pythonでは文字列のエスケープ文字を表す。そのため、Windowsのファイルパスを記述する場合、区切り文字を『¥』ではなく、『¥¥』と二回重ねて書く必要がある。
例えば、kujiraというユーザーのデスクトップ上にある『test.txt』というファイルを削除するのであれば、次のように指定する必要がある。
import os
os.remove("c:¥¥Users¥¥kujira¥¥Desktop¥¥test.txt")
次に、空のフォルダ(ディレクトリ)を削除する方法を見てみよう。それが、『os.rmdir(フォルダパス)』だ。例えば『/path/to/empty』というフォルダを削除するプログラムは、次のようになる。
import os
os. rmdir("/path/to/empty")
ただし、空のフォルダでなければ削除できないので注意しよう。もし、ファイルの入ったフォルダを削除したい場合には、一度、フォルダ以下のファイルを全部削除してから、os.rmdir()でフォルダを削除する必要がある。
とは言え、それは面倒なので、フォルダが空でなくても削除する関数も用意されている。それが、Python標準添付のshutilモジュールの『shutil.rmtree(フォルダパス)』だ。例えば、ファイルが入っている『/path/to/kesitai』というフォルダを丸ごと削除したければ、次のようなプログラムを記述する。
import shutil
shutil.rmtree("/path/to/kesitai")
ただし、ファイルやフォルダの完全削除を行う関数なので、取り扱いには気をつけよう。もちろん、親切に「削除しても良いですか?」などのダイアログは全く表示されないどころか、ゴミ箱に入ることもない。
完全削除するのではなくゴミ箱に入れよう
しかし、うっかり大切なファイルを消してしまうという失敗を避けるためには、上記の関数を使って完全にファイルを削除してしまうのではなく、削除と同時にそれがゴミ箱に入るようにしたいという場合もあるだろう。その場合には、Send2Trashというライブラリを使う。WindowsにもmacOSにも対応しているので、安心して使える。
Send2Trashをインストールするには、コマンドラインを開いて、pipコマンドを使う。
# Send2Trash のインストール
pip install Send2Trash
なお、WindowsのAnaconda環境であれば、『Anaconda Prompt』を開いてコマンドを実行しよう。また、Anaconda未導入のmacOSなら、上記コマンドのpipをpip3に置き換えて実行する必要がある。最近では、多くの環境で、Python3がデフォルトになってきているので、pipやpythonのようにバージョン番号を省略して記述できるようになってきた。
さて、Send2Trashのインストールができたら、次のようなプログラムを書くことで、『/path/to/kesitai』のフォルダを削除してゴミ箱に入れることができる。
from send2trash import send2trash
send2trash('/path/to/kesitai')
次の画像は、プログラムを実行したところだ。
特に、自作ツールをPythonで作る場合には、いきなりファイルが消えてしまうよりも、プログラムを作る時に、記述ミスを考慮して、Send2Trashを使うと安心だろう。転ばぬ先の杖だ。
不要ファイルを一気に削除するツールを作ろう
それでは、不要ファイルを一気に削除するツールを作ってみよう。ここで作るのは、指定フォルダ以下にある全ての不要ファイルを一気に削除するようなものを作ってみよう。
不要ファイルは、使っているアプリによって異なるが、今回は、一般的なキャッシュファイルやバックアップファイルを対象として削除するものにしよう。WindowsならThumbs.db、macOSなら.DS_Store、一般的なバックアップファイルの形式『.bak』と『.tmp』の形式を対象にしてみよう。
以下のプログラムを『不要削除.bat』という名前で保存しよう。そして、(*1)で指定しているPythonのインストールパスを書き換えよう。もし、環境変数のPATHにPythonを登録しているなら、単に「python.exe」と指定できる。だが、最近では、デフォルトでは、Pythonのインストール時に環境変数を書き換えない設定になっているので、その場合には、しっかりと正しいパスを指定する必要がある。
REM = r""" ↓Pythonパスを指定 --- (*1)
SET PYTHON_EXE="c:\Users\kujira\Anaconda3\python.exe"
%PYTHON_EXE% %0 %1
PAUSE
EXIT
"""
# === 以下がPythonのプログラム === --- (*2)
import os, sys
from glob import glob
from send2trash import send2trash
# pattern --- (*3)
pattern_list = [
"**/Thumbs.db",
"**/.DS_Store",
"**/*.bak",
"**/*.tmp"
]
# --- どのフォルダを処理するか決める --- (*4)
root_dir = os.path.abspath(os.path.dirname(__file__))
if len(sys.argv) > 1:
root_dir = sys.argv[1]
os.chdir(root_dir)
print("---")
print("削除対象フォルダ =", root_dir)
print("---")
# パターンに応じてファイルを再帰的に削除 --- (*5)
for pattern in pattern_list:
files = glob(pattern, recursive=True)
for f in files:
print("ゴミ箱行き: ", f)
send2trash(f)
}}}
Windowsでプログラムを実行するには、バッチファイルをフォルダにコピーした上でダブルクリックするか、特定のフォルダをバッチファイルにドラッグしよう。
なお、macOSでは、以下のようにして、コマンドラインからツールを実行できる。(Anaconda未導入のmacOSでは、pythonのところを、python3に置き換えて実行しよう。)
python 不要削除.bat (対象フォルダパス)
それでは、プログラムを見てみよう。(*1)の部分はWindows専用のコードで、バッチファイルからPythonを起動するコードだ。そして、(*2)以下の部分が実際のPythonのプログラムとなる。このように、ちょっと仕掛けを作ると、バッチファイルの中にPythonプログラムを記述することができる。
そして、(*3)の部分では、削除するパターンを指定する。glob()関数で、recursive=Trueのオプションを追加した場合、再帰的にファイルを列挙できる。この場合、『**/Thumbs.db』のように指定する。このパターンを変更することで、任意の形式のファイルを削除できるようになる。(*4)の部分では、どのフォルダを処理するか決定します。(*5)の部分で、実際に削除対象のファイルを列挙して、send2trash()関数でファイルを削除する。
まとめ
以上、今回はファイルやフォルダを削除する方法を紹介し、実際に使える不要ファイルの削除ツールを作ってみた。定期的に、不要ファイルを削除しているなら、このように、バッチファイルを作って、手軽に削除できるようにしておくと便利だ。もちろん、単純なルールであれば、Pythonを使わなくても良いのだが、Pythonを利用することで、削除したファイルがゴミ箱に入るようにしたり、より複雑なルールで振り分けをしたりできるようになる。今回のプログラムを参考にして、Pythonを仕事で活用しよう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。