HOWTO · Python

Python でファイルをコピーする方法

Python には、Shell オペレーティングシステムユーティリティを使ってファイルをコピーするための関数が組み込まれています。shutil copyfile()メソッドは、ターゲットが書き込み可能な場合に限り、ソースファイルを受信者にコピーします。コピー先がフォルダの場合、`copy()` メソッドはその中にソースファイルと同じ名前の新しいファイルを作成します。

このページの内容

Python には、ファイル I/O 操作(OS、サブプロセス、shutil など)をサポートするいくつかのアウトオブボックスモジュールが付属しています。shutil モジュールを使ってファイルやディレクトリをコピーします。ファイルやディレクトリの複製、転送、削除などの操作は、このユーティリティ関数を使って完了します。ここでは、以下の 4つの方法について説明します。

Python でファイルをコピーする Shutil copyfile() メソッド

コピー元の素材をコピー先の名前のファイルにコピーします。コピー先が書き込み可能でない場合、コピー処理中に IOError 例外が発生します。コピー元のファイルとコピー先のファイルが同じ場合は SameFileError が返る。コピー元とコピー先のパス名は文字列として提供されます。

copyfile(source_file, destination_file)

文字やブロックデバイスやパイプはこのメソッドではサポートされていません。

import shutil

source = r"C:\Users\DelftStack\Documents\test\test.txt"
destination = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copyfile(source, destination)

パーミッションでファイルをコピーする Shutil copy() メソッド

copy() メソッドは Unix のコマンド cp のように動作します。内容をコピーすると、このメソッドはターゲットファイルのパーミッションをソースファイルと同期させます。同じファイルをコピーしている場合、SameFileError もスローされます。構文は以下の通りです。

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

Shutil の copy() メソッドでファイルをコピーする例

import shutil

src = r"C:\Users\DelftStack\Documents\test\test.txt"
des = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copy(src, des)

copy() メソッドと copyfile() メソッドの比較

  1. copy() メソッドは内容をコピーする際にファイルのパーミッションを設定することが多いが、copyfile() はデータのみをコピーします。
  2. 基本的に、copyfile() メソッドの実装では、copyfileobj() メソッドを用います。これに対して、copy() メソッドは関数 copyfile() と copymode() を用います。
  3. 上記の点から、copyfile() の方が copy() よりも若干高速であることがわかります。

ファイルオブジェクトをコピーするための copyfileobj() メソッド

この関数は対象のパスまたはファイルのオブジェクトにファイルをコピーします。コピー先のオブジェクトがファイルオブジェクトの場合は、copyfileobj() を直接呼び出してからファイルを閉じる必要があります。バッファサイズはバッファの長さを指定するのに用います。これはコピーの過程でメモリに保持されるバイト数です。

以下に copyfileobj() メソッドの構文を示します。

shutil.copyfileobj(src_file_object, dest_file_object[, length])
import shutil

filename1 = r"C:\Users\DelftStack\Documents\test\test.txt"
fileA = open(filename1, "rb")
filename2 = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
fileB = open(filename2, "wb")
shutil.copyfileobj(fileA, fileB)

メタデータを保存するための copy2() メソッド

copy2() メソッドは copy() メソッドに似ていますが、ファイルの内容をコピーするだけでなく、ソースファイルのメタデータをすべて保存します。

shutil.copy2(src_file, dest_file, *, follow_symlinks=True) メソッドは copy() メソッドと似ています。

import shutil

src = r"C:\Users\DelftStack\Documents\test\test.txt"
des = r"C:\Users\DelftStack\Pictures\test2\test2.txt"
shutil.copy2(src, des)

Python でファイルをコピーする方法のまとめ

最終的には、すべてのメソッドの表が添付されており、shutil ユーティリティをよりよく理解するのに役立ちます。

関数 メタデータのコピー コピー許可 バッファが使える 宛先はディレクトリの場合もあります。
shutil.copy いいえ はい いいえ はい
shutil.copyfile いいえ いいえ いいえ 否
shutil.copy2 はい はい 否 はい
shutil.copyfileobj いいえ いいえ はい いいえ