Pythonでのファイルコピー完全ガイド|shutilモジュールの使い方とエラーハンドリング

1. はじめに

Pythonは、ファイル操作を手軽に行うための強力なツールを提供しています。その中でも、ファイルのコピーは日常的なタスクの一つです。本記事では、Pythonの標準ライブラリであるshutilモジュールを使用し、ファイルやディレクトリを効率的にコピーする方法を紹介します。具体的なコード例と共に、上書きを防ぐテクニックやエラーハンドリング、さらには応用的なファイルコピー方法も取り上げます。

2. Pythonでファイルをコピーするための準備

shutilモジュールのインポート

shutilモジュールは、Pythonの標準ライブラリであり、追加のインストールは不要です。次のコードでインポートします。

import shutil

ファイルのコピー、移動、削除といった操作が可能になります。また、osモジュールと組み合わせることで、ファイルやディレクトリの存在確認を行い、エラーハンドリングを強化できます。

shutilモジュールのメリット

shutilモジュールは、直感的な操作とシンプルなコード構造が特徴です。特に、ファイルやディレクトリ全体の一括操作が必要な場合、shutilは強力なツールとなります。

3. shutilモジュールの基本的な使い方

shutil.copy()の使い方

shutil.copy()は、ファイルをコピーする際の基本的な関数です。この関数は、元のファイルを指定した新しい場所にコピーします。

import shutil

# ファイルのコピー
shutil.copy('original.txt', 'copy.txt')

コピー先に同名のファイルが存在する場合、上書きされます。

shutil.copy2()の使い方

shutil.copy2()は、ファイルのメタデータ(作成日時、アクセス権限など)も含めてコピーするための関数です。

import shutil

# ファイルの内容とメタデータをコピー
shutil.copy2('original.txt', 'copy_with_metadata.txt')

ファイルの完全な複製を作成したい場合に便利です。

4. ディレクトリ全体をコピーする方法

shutil.copytree()の使用方法

shutil.copytree()は、ディレクトリ全体を再帰的にコピーするための関数です。元のディレクトリ内のすべてのファイルとサブディレクトリを新しい場所にコピーします。

import shutil

# ディレクトリのコピー
shutil.copytree('source_directory', 'destination_directory')

ただし、コピー先に同名のディレクトリが存在すると、エラーが発生するため、事前に確認する必要があります。

コピー時に無視するファイルやディレクトリの指定

特定のファイルやディレクトリをコピー対象から除外するには、ignore引数にshutil.ignore_patterns()を使用します。

import shutil

# .logファイルを無視してコピー
shutil.copytree('source_directory', 'destination_directory', ignore=shutil.ignore_patterns('*.log'))

このコードでは、.logファイルを除外してディレクトリ全体をコピーします。

5. 上書きを防ぐテクニック

os.path.exists()を使用する

shutil.copy()shutil.copy2()を使用すると、同名のファイルが存在する場合、デフォルトで上書きされます。これを防ぐためには、ファイルの存在を事前に確認する必要があります。

import shutil
import os

# 上書きを防ぐためのファイル存在確認
if not os.path.exists('copy.txt'):
    shutil.copy('original.txt', 'copy.txt')
else:
    print('ファイルは既に存在します。コピーをスキップします。')

pathlib.Path.exists()を使用する

pathlibを使用することで、ファイル存在確認をより直感的に行うことができます。

from pathlib import Path

# Pathオブジェクトで存在確認
dst = Path('copy.txt')

if not dst.exists():
    shutil.copy('original.txt', dst)
else:
    print('ファイルは既に存在します。コピーをスキップします。')

6. Pythonでファイルを移動する方法

shutil.move()の使い方

shutil.move()はファイルやディレクトリを別の場所に移動するための関数です。

import shutil

# ファイルの移動
shutil.move('original.txt', 'new_folder/original.txt')

移動先のディレクトリが存在しない場合、FileNotFoundErrorが発生するため、事前にディレクトリの存在を確認し、必要に応じて作成することが推奨されます。

import shutil
import os

# ディレクトリの存在確認と作成
if not os.path.exists('new_folder'):
    os.makedirs('new_folder')

# ファイルの移動
shutil.move('original.txt', 'new_folder/original.txt')

 

7. Pythonでのファイルコピーの実例コード

ファイルをコピーする例

import shutil

# ファイルをコピー
shutil.copy('data.txt', 'backup/data_backup.txt')

ディレクトリ全体をコピーする例

import shutil

# ディレクトリをコピー
shutil.copytree('project_files', 'project_backup')

上書きを防ぐための例

import shutil
import os

# 上書きしないためのコピー
if not os.path.exists('backup/report.txt'):
    shutil.copy('report.txt', 'backup/report.txt')
else:
    print('ファイルは既に存在します。コピーを中止します。')

8. 応用編: 特定のファイル形式のみをコピーする方法

globモジュールを使用すれば、特定のファイル形式(例えば.txt.csv)のみを選択的にコピーできます。

import shutil
import glob

# .txtファイルを全てコピー
for file in glob.glob('data/*.txt'):
    shutil.copy(file, 'backup/')

これにより、dataフォルダ内のすべての.txtファイルをbackupフォルダにコピーします。

9. エラーハンドリングと例外処理

ファイル操作中に起こりうるエラーに対して、例外処理を行うことは非常に重要です。たとえば、ファイルが見つからなかったり、権限エラーが発生することがあります。

基本的な例外処理の追加

import shutil

try:
    shutil.copy('non_existent_file.txt', 'backup/')
except FileNotFoundError as e:
    print(f'ファイルが見つかりません: {e}')
except PermissionError as e:
    print(f'権限エラーが発生しました: {e}')
except Exception as e:
    print(f'予期しないエラーが発生しました: {e}')

このコードでは、特定のエラーをキャッチして、それに応じた処理を行います。

10. まとめ

Pythonのshutilモジュールを使えば、ファイルやディレクトリのコピーを簡単に行えます。上書きを防ぐテクニックや、特定のファイルのみをコピーする方法、さらにエラーハンドリングを追加することで、ファイル操作をより安全かつ効率的に行うことができます。この記事を参考に、日常の作業においてPythonでのファイルコピーを活用してみてください。