[Python] フォルダやファイルのコピー、移動、削除(shutilモジュール)

Python ファイル操作

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'

ファイル・フォルダの削除

shutil.rmtree()関数は、フォルダの中身ごと削除します。削除したいディレクトリパスを引数に設定します。

>>> import shutil
>>> shutil.rmtree('./sample_backup')

<参考記事>osモジュールを使ったファイル・フォルダの削除(os.remove、os.unlink、 os.rmdir)

まとめ

shutilモジュールを使った、フォルダ・ファイルのコピー、移動、削除の方法についてまとめました。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project

コメント

  1. […]  (C)ファイルのコピーは、shutilモジュールを使う。    下記のWEBページにお世話になりました。ありがとうございます。    ・[Python] フォルダやファイルのコピー、移動、削除(shutilモジュール) […]