この記事では、Pythonで任意のファイルを複製(コピー)、または移動する方法を紹介します。
ファイルをコピーする方法
ファイル、またはディレクトリにコピーする
ファイルをコピーするにはshutilモジュールのcopy()関数を使います。
構文
shutil.copy(src, dst, *, follow_symlinks=True)
引数
| src | コピーしたいファイルの名前(パス) |
|---|---|
| dst | コピー先のファイル名、またはディレクトリ名(パス) |
| follow_symlinks | follow_symlinks が偽で、src がシンボリックリンクの場合、 dst はシンボリックリンクとして作成されます。 follow_symlinks が真で src がシンボリックリンクの場合、 dst には src のリンク先のファイルがコピーされます。 |
戻り値の型
dst引数が返される。(文字列型)
解説
ファイルsrcをdstにコピーします。
dstがディレクトリだった場合、srcの名前でディレクトリ内にコピーされます。dstが既に存在しているファイル名だった場合は、コピーに置き換えられます。
注意
ファイルのデータとパーミッションをコピーしますが、メタデータはコピーしません。メタデータまでコピーしたい場合は、次に紹介するcopy2()を参照してください。
例外
src引数にディレクトリを指定した場合、IsADirectoryError例外が発生します。
例 textディレクトリに存在しているtestText.txtをcopy_testText.txtとしてコピーしてみる:
from shutil import copy # コピーするファイルのパス file_path = 'text/testText.txt' # コピー先のパス copy_path = 'copy_testText.txt' # file_path を copy_path にコピー copy(file_path, copy_path)
すると、以下のようにcopy_testText.txtがカレントディレクトリにコピーされました。
ちゃんと中身もコピーされています。
メタデータを保持しながらコピーする
先ほどのcopy()関数 ではメタデータ(作成時間や変更時間)はコピーされません。メタデータもコピーしたい場合は、shutilモジュールのcopy2()関数を使います。
shutil.copy2(src, dst, *, follow_symlinks=True)
使い方はcopy()関数と全く同じなので例だけ見てみましょう。
例 copy()関数の時と同様のコードをcopy2()関数を使って実行してみます。
from shutil import copy2 # 変更 # コピーするファイルのパス file_path = 'text/testText.txt' # コピー先のパス copy_path = 'copy2_testText.txt' # 変更 # file_path を copy_path にコピー copy2(file_path, copy_path)
僕の環境(Wondows11, Python 3.11)では更新日だけコピーできました。 高水準のファイルコピー関数(shutil.copy(), shutil.copy2())でも、ファイルのメタデータの全てをコピーすることはできないらしいので注意してください。
高速なコピー
高速でコピーしたい場合は、shutil.copyfile()関数を使います。この関数は最も効率的な方法でコピーを行いますが、代わりにdst引数に必ずファイル名を指定する必要があります。
shutil.copyfile(src, dst, *, follow_symlinks=True)
例外
srcとdstが同じファイルだった場合にSameFileErrorを送出するdstで指定されたファイルが書き込み不可の場合にOSError例外を送出する
例 使い方はdstにファイルを指定しなければならないこと以外同じです:
from shutil import copyfile # コピーするファイルのパス file_path = 'text/testText.txt' # コピー先のパス copy_path = 'copy_testText.txt' # file_path を copy_path にコピー copyfile(file_path, copy_path)
ファイルを移動する
ファイルを移動するにはshutilモジュールのmove()関数を使います。
shutil.move(src, dst, copy_function=copy2)
src引数に指定したファイル、またはディレクトリをdst引数に指定した場所に移動します。copy_function引数には、コピー時に使用する関数を指定します。同名のファイルが存在している場合、大体はエラーが発生しますが、OSによっては上書きされてしまうので注意が必要です。
例 textディレクトリ内にあるtestText.txtをカレントディレクトリに移動させます。
from shutil import move import os # 移動するファイルのパス file_path = 'text/testText.txt' # file_pathをカレントディレクトリに移動 move(file_path, os.getcwd())
Linkファイルのパスを取得する方法
まとめ
この記事では、Pythonでファイルをコピー、または移動させる方法を解説しました。
ここで紹介した関数以外にもshutilモジュールにはファイルやファイルの集まりに対する高水準な関数が用意されています。ファイル操作がしたいなと思ったらぜひとも使ってみてください。
外部Linkshutil --- 高水準のファイル操作 — Python 3.12.0 ドキュメント
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ


