shutilモジュールはファイル・フォルダのコピー(copy、copytree)や移動(move)、削除(rmtree)するのに使えます。特に中身が入ったフォルダでも操作可能というのが特徴だと思います。本記事ではこのモジュールの使い方についてまとめます。
確認した環境
- OS: Ubuntu 16.04LTS
- Python: ver3.7.2
前提となるディレクトリ構成
.
├── file01.txt ★ファイル
├── new.txt ★ファイル
└── sample ★ディレクトリ
ファイル・フォルダのコピー
ファイルをコピーするには、shutil.copy()関数を用います。
- コピー元を第一引数srcに、コピー先を第二引数dstに指定します。
- dstがディレクトリの場合は、srcで指定したファイルパスのベース名を使ってコピーされます。(=同じファイル名でコピー)
- 返り値は、新しく作成したファイルのパスです。
以下に例を示します。
>>> import shutil
# 第二引数がディレクトリの場合、同じファイル名でコピーされます
>>> shutil.copy('./file01.txt', './sample')
'./sample/file01.txt'
別名でコピーするには、第二引数dstに新しいファイル名を指定します。
>>> shutil.copy('./file01.txt', './sample/file02.txt')
'./sample/file02.txt'
尚、copy() はファイルのデータとパーミッションをコピーしますが、その他のファイルの作成時間や変更時間などのメタデータはコピーしません。
コピー元のファイルのメタデータを保存したい場合は、 copy2()メソッド を使います。
>>> shutil.copy2('./file01.txt', './sample/file03.txt')
'./sample/file03.txt'
コピー元ファイル
-rw-rw-r-- 1 hibikisan hibikisan 35 1月 18 00:27 file01.txt
コピー後ファイル
-rw-rw-r-- 1 hibikisan hibikisan 35 1月 18 00:28 file01.txt ← copy()でコピー
-rw-rw-r-- 1 hibikisan hibikisan 35 1月 18 00:29 file02.txt ← copy()でコピー
-rw-rw-r-- 1 hibikisan hibikisan 35 1月 18 00:27 file03.txt ← copy2()でコピー
copy2()メソッドでコピーしたファイル(file03.txt)はファイル生成時間もコピーされていることがわかります。
フォルダの中身ごとコピー
ところで、上記のcopy()メソッドは中身が入っているフォルダをコピーしようとするとエラーになります。(下記参照)
>>> shutil.copy('./sample', './sample_02')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/hibikisan/anaconda3/envs/python3.7/lib/python3.7/shutil.py", line 245, in copy
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "/home/hibikisan/anaconda3/envs/python3.7/lib/python3.7/shutil.py", line 120, in copyfile
with open(src, 'rb') as fsrc:
IsADirectoryError: [Errno 21] Is a directory: './sample'
そこで、フォルダの中身ごとコピーするには、shutil.copytree()関数を使います。コピー元とコピー先の引数設定はcopy()メソッドと同様です。
>>> import shutil
>>> shutil.copytree('./sample', './sample_backup')
'./sample_backup'
ファイル・フォルダの移動
shutil.move()関数を使うと、指定したファイルやフォルダを別の場所に移動します。移動元と移送先の引数設定はcopy()メソッドと同様です。
指定した移動先が既に存在しているディレクトリの場合は、ファイルはそのディレクトリの内部に移動されます。移動先が既に存在しているがディレクトリでない場合は、ファイル名を変えて指定のフォルダへ移動されます。
#ファイルを指定のフォルダへ移動
>>> import shutil
>>> shutil.move('./new.txt', './sample')
'./sample/new.txt'
#ファイルを名前を変えて指定のフォルダへ移動
>>> shutil.move('./new.txt', './sample/new02.txt')
'./sample/new02.txt'
ファイル・フォルダの削除
- ファイル個別を削除するには、os.remove()やos.unlink()を使います。
- 空のフォルダを削除するにはos.rmdir()を使います。
shutil.rmtree()関数は、フォルダの中身ごと削除します。削除したいディレクトリパスを引数に設定します。
>>> import shutil
>>> shutil.rmtree('./sample_backup')
<参考記事>osモジュールを使ったファイル・フォルダの削除(os.remove、os.unlink、 os.rmdir)
まとめ
shutilモジュールを使った、フォルダ・ファイルのコピー、移動、削除の方法についてまとめました。
コメント
[…] (C)ファイルのコピーは、shutilモジュールを使う。 下記のWEBページにお世話になりました。ありがとうございます。 ・[Python] フォルダやファイルのコピー、移動、削除(shutilモジュール) […]