Pythonのshutilモジュールで実現する高レベルなファイル操作の完全ガイド
Pythonの標準ライブラリに含まれるshutilモジュールには、ファイルやディレクトリに対する高レベルな操作を行うための便利な関数が数多く定義されています。本記事では、shutilモジュールの主要な関数について、実際のコード例とともにわかりやすく解説します。
copy():ファイルをコピーする
copy()関数は、既存のファイルを同一または別のディレクトリ内の指定した場所へコピーします。第1引数にはコピー元ファイルのパスを文字列で指定し、第2引数にはコピー先のファイル名またはディレクトリ名を指定します。第2引数にディレクトリを指定した場合は、その中に同じ名前でファイルがコピーされます。ただし、この関数では元ファイルのメタデータ(タイムスタンプなど)は引き継がれない点に注意してください。
>>> import shutil
>>> shutil.copy("hello.py","newdir/")
'newdir/hello.py'
copy2():メタデータを保持してコピーする
copy2()関数はcopy()関数とほぼ同じ動作をしますが、決定的に異なる点はコピー元ファイルのメタデータを保持することです。たとえば、コピー後のファイルの更新日時は元のファイルと同じ値になります。
>>> shutil.copy2('person.py', 'newdir/')
'newdir/person.py'
copyfile():ファイル名を指定してコピーする
copyfile()関数は、2つの文字列引数としてファイル名を受け取ります。つまり、元のファイルを同じディレクトリ内に指定した名前でコピーします。
>>> shutil.copyfile('start.py', 'end.py')
'end.py'
copyfileobj():ファイルオブジェクトを使ってコピーする
copyfileobj()関数は、ファイル名を表す文字列ではなく、ファイルオブジェクトを引数として受け取ります。ファイルオブジェクトはopen()関数で取得します。コピー元のファイルは読み取り権限('r')で開き、コピー先のファイルは書き込み権限('w')で開いておく必要があります。
>>> f1=open('hello.py','r')
>>> f2=open('python.py','w')
>>> shutil.copyfileobj(f1, f2)
move():ファイルやディレクトリを移動する
move()関数は、ファイルやディレクトリをあるディレクトリから別のディレクトリへ再帰的に移動します。
>>> shutil.move('hello.py', 'newdir/')
'newdir/hello.py'
copytree():ディレクトリ全体を再帰的にコピーする
copytree()関数は、あるディレクトリ内のファイルとサブディレクトリを別のディレクトリへ再帰的にコピーします。両方の引数は文字列で指定する必要があり、第2引数に指定するディレクトリは事前に存在していてはいけません。個々のファイルのコピーには、内部的にcopy2()関数が使用されます。
>>> shutil.copytree('dir1','dir2')
'dir2'
rmtree():ディレクトリを丸ごと削除する
rmtree()関数は、指定されたディレクトリ内のファイルとサブディレクトリをすべて削除します。削除は元に戻せないため、実行時には十分注意してください。
>>> shutil.rmtree('dir2')
disk_usage():ディスク使用量を取得する
disk_usage()関数は、指定したパスのディスク使用状況の統計情報を取得します。total(総容量)、used(使用量)、free(空き容量)がバイト単位で返されます。
>>> shutil.disk_usage('c:\python36\dir1')
usage(total=245681352704, used=84932993024, free=160748359680)
which():実行可能ファイルのパスを検索する
which()関数は、指定した実行可能ファイルへのパスを返します。Unix系OSのwhichコマンドに相当する機能です。
>>> shutil.which('calc')
'C:\WINDOWS\system32\calc.EXE'
make_archive():アーカイブを作成する
make_archive()関数は、ルートディレクトリ内のファイルをもとにアーカイブ(zipまたはtar)を作成します。第1引数にアーカイブ名、第2引数にフォーマット、第3引数にルートディレクトリを指定します。
>>> root_dir='newdir'
>>> shutil.make_archive("newdirarch","zip",root_dir)
'C:\python36\newdirarch.zip'
get_archive_formats():サポートされるアーカイブ形式の一覧を取得する
get_archive_formats()関数は、サポートされているすべてのアーカイブ形式の一覧を返します。
>>> shutil.get_archive_formats()
[('bztar', "bzip2'ed tar-file"), ('gztar', "gzip'ed tar-file"), ('tar', 'uncompressed tar file'), ('xztar', "xz'ed tar-file"), ('zip', 'ZIP file')]
unpack_archive():アーカイブを展開する
unpack_archive()関数は、指定されたアーカイブ内のファイルを展開します。第2引数には展開先のディレクトリを指定します。省略した場合は、カレントディレクトリに展開されます。
>>> shutil.unpack_archive('newdirarch.zip','newdir')
まとめ
shutilモジュールを活用すれば、ファイルのコピーや移動、ディレクトリツリーの複製、アーカイブの作成・展開といった日常的なファイル操作を、シンプルかつ効率的に自動化できます。用途に応じて適切な関数を選択し、Pythonスクリプトによる作業効率化にぜひ役立ててください。
-
Pythonのファイルオブジェクトとは?open関数によるファイル操作の基本を徹底解説
Pythonでは、ファイルを読み書きする際に特別なライブラリをインポートする必要はありません。ファイル操作は言語にネイティブに組み込まれているためです。 まず最初に行うのは、組み込み関数 open() を使ってファイルオブジェクトを取得することです。open() 関数はファイルを開き、ファイルオブジェクトを返します。このファイルオブジェクトには、開いたファイルから情報を取得したり、内容を操作したりするためのメソッドや属性が含まれています。 ファイルとは何か? ファイル操作を行う前に、「ファイルとは何か」を理解しておきましょう。ファイルとは、関連する情報を保存するためにディスク上に確保された「名
-
【Python】ジャンクファイルオーガナイザーで面倒なファイル整理を一括自動化
はじめに 大量のファイルやフォルダをひとつのディレクトリに放り込みっぱなしにして、「何のファイルがあったんだっけ?」と混乱しがちなPythonプログラマーは少なくありません。そんな「怠惰(=効率重視)」な開発者にとって、手作業でのファイル整理は面倒この上ないものです。 そこで本記事では、散らかったフォルダ内のファイルを拡張子ごとに適切なフォルダへ一括で振り分け、さらに不要になった空のディレクトリまで削除してくれるPythonスクリプトを紹介します。コマンドひとつでフォルダがすっきり片付くので、ぜひ活用してみてください。 具体的には、さまざまな種類のファイルが混在したディレクトリ(下図)を入力と