今回は、Pythonでファイルをコピーする方法についてご紹介します。
Pythonでファイルをコピーする方法はいくつか存在します。
代表的な方法としては、標準ライブラリであるshutilモジュールを使う方法や、ファイルオブジェクトを操作する方法などが挙げられます。
それぞれ用途や目的に応じてメリット・デメリットがあるため、この記事では複数の方法と注意点を解説します。
shutilモジュールを使ったファイルコピー
まず、ファイルコピーに最も手軽に使えるのがshutilモジュールです。
特に以下の関数がよく利用されます。
- shutil.copy():ファイルの内容とパーミッションをコピー
- shutil.copy2():可能な限りメタデータ(タイムスタンプなど)も含めてコピー
- shutil.copyfile():ファイル内容のみをコピー(既存ファイルの場合は上書き)
- shutil.copytree():ディレクトリ全体を再帰的にコピー
以下では、それぞれの基本的なコード例を示します。
shutil.copy()
shutil.copy()はファイルの内容とパーミッションをコピーします。
1 2 3 4 5 6 7 8 9 10 |
import shutil src = 'source.txt' dst = 'destination.txt' try: shutil.copy(src, dst) print(f"{src} を {dst} にコピーしました。") except Exception as e: print(f"コピーに失敗しました: {e}") |
source.txt を destination.txt にコピーしました。
shutil.copy2()
shutil.copy2()はshutil.copy()とほぼ同様の動作をしますが、可能な限りメタデータもコピーします。
1 2 3 4 5 6 7 8 9 10 |
import shutil src = 'source.txt' dst = 'destination.txt' try: shutil.copy2(src, dst) print(f"{src} を {dst} にメタデータ付きでコピーしました。") except Exception as e: print(f"コピーに失敗しました: {e}") |
source.txt を destination.txt にメタデータ付きでコピーしました。
shutil.copyfile()
shutil.copyfile()はファイル内容のみをコピーし、ファイル先が既に存在する場合は上書きします。
1 2 3 4 5 6 7 8 9 10 |
import shutil src = 'source.txt' dst = 'destination.txt' try: shutil.copyfile(src, dst) print(f"{src} の内容を {dst} にコピーしました。") except Exception as e: print(f"コピーに失敗しました: {e}") |
source.txt の内容を destination.txt にコピーしました。
shutil.copytree()
shutil.copytree()はディレクトリ(フォルダ)全体をサブディレクトリごと再帰的にコピーします。
コピー先のディレクトリが既に存在するとエラーが発生するため、注意が必要です。
1 2 3 4 5 6 7 8 9 10 |
import shutil src_dir = 'source_folder' dst_dir = 'destination_folder' try: shutil.copytree(src_dir, dst_dir) print(f"{src_dir} の内容を {dst_dir} に再帰的にコピーしました。") except Exception as e: print(f"ディレクトリのコピーに失敗しました: {e}") |
source_folder の内容を destination_folder に再帰的にコピーしました。
ファイルオブジェクトを使ったコピー
次に、shutilを使わない方法として、ファイルオブジェクトで読み書きする方法があります。
これは細かい制御がしやすい一方で、メモリ使用量や処理速度に注意を払う必要があります。
一括読み込み&書き込み
ファイルをバイナリモードで開き、一括で読み込んで書き込みます。
1 2 3 4 5 6 7 8 9 10 11 |
src = 'source.txt' dst = 'destination.txt' try: with open(src, 'rb') as f_src: data = f_src.read() with open(dst, 'wb') as f_dst: f_dst.write(data) print(f"{src} の内容を一括して {dst} にコピーしました。") except Exception as e: print(f"コピーに失敗しました: {e}") |
source.txt の内容を一括して destination.txt にコピーしました。
ブロック単位で読み書き
大きなファイルをコピーする場合は、ある程度のサイズに区切って読み書きすることでメモリ使用量を抑えられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
src = 'source.txt' dst = 'destination.txt' buffer_size = 1024 * 1024 # 1MBずつ読み込み try: with open(src, 'rb') as f_src, open(dst, 'wb') as f_dst: while True: block = f_src.read(buffer_size) if not block: break f_dst.write(block) print(f"{src} の内容をブロック単位で {dst} にコピーしました。") except Exception as e: print(f"コピーに失敗しました: {e}") |
source.txt の内容をブロック単位で destination.txt にコピーしました。
shutil.copyfileobj()
開いているファイルオブジェクト間でコピーを行いたいときはshutil.copyfileobj()が便利です。
1 2 3 4 5 6 7 8 9 10 11 12 |
import shutil src = 'source.txt' dst = 'destination.txt' buffer_size = 1024 * 1024 # 必要に応じてバッファサイズを指定 try: with open(src, 'rb') as f_src, open(dst, 'wb') as f_dst: shutil.copyfileobj(f_src, f_dst, length=buffer_size) print(f"{src} の内容を copyfileobj で {dst} にコピーしました。") except Exception as e: print(f"コピーに失敗しました: {e}") |
source.txt の内容を copyfileobj で destination.txt にコピーしました。
よくあるエラーと対処法
ファイルコピー時はさまざまなエラーが起こり得ます。
- FileNotFoundError:ソースファイルやディレクトリが存在しない場合に発生
- PermissionError:ファイルのアクセス権が不足している場合に発生
- FileExistsError:copytree()でコピー先のディレクトリが既に存在するときなどに発生
例外処理を適切に入れておくことで、エラー発生時に原因を特定しやすくなります。
また、コピー先のファイルを誤って上書きしないように、事前に存在チェックを行う方法も有効です。
まとめ
Pythonでファイルをコピーする際には、shutilモジュールを使う方法がシンプルで便利です。
用途やファイルサイズに応じて、一括読み込みやブロック単位、copyfileobj()などを使い分けられます。
適切な例外処理や事前チェックを入れて、安全にファイルを取り扱ってみてください。