Pythonでshutilモジュールを使ってディレクトリをコピーする方法

この記事では、Pythonのshutilモジュールを使ってディレクトリをコピーする方法について詳しく説明します。具体的なコード例とその解説、さらには多角的な応用例までを含めています。

目次

shutilモジュールとは?

shutilモジュールは、Pythonの標準ライブラリの一つであり、ファイルやディレクトリ(フォルダ)の操作を手軽に行えるように設計されています。

基本的なディレクトリのコピー

import shutil

# ディレクトリをコピー
# 'src_folder'はコピー元、'dst_folder'はコピー先
shutil.copytree('src_folder', 'dst_folder')

このコードは、`src_folder`という名前のディレクトリを、`dst_folder`という名前でコピーします。

コピー先のディレクトリが存在する場合

デフォルトでは、コピー先のディレクトリが既に存在する場合、エラーが発生します。

解決策

# コピー先のディレクトリが存在する場合に上書きする
shutil.rmtree('dst_folder')
shutil.copytree('src_folder', 'dst_folder')

この例では、`shutil.rmtree()`を用いて、コピー先のディレクトリを先に削除しています。

応用例

特定のファイルタイプだけをコピーする

import os

# 特定の拡張子のファイルだけをコピーする関数
def copy_specific_files(src, dst, extension):
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        
        if os.path.isdir(s):
            shutil.copytree(s, d)
        else:
            if item.endswith(extension):
                shutil.copy2(s, d)

# 使用例
copy_specific_files('src_folder', 'dst_folder', '.txt')

この例では、特定のファイルタイプ(ここでは`.txt`)だけをコピーする関数`copy_specific_files`を定義しています。

ディレクトリのコピーにフィルタを適用する

# フィルタ関数を使用して特定の条件のファイル/フォルダだけをコピーする
def my_filter(names):
    return [name for name in names if not name.startswith('.')]
    
shutil.copytree('src_folder', 'dst_folder', ignore=my_filter)

この例では、`copytree`メソッドの`ignore`引数にフィルタ関数を指定しています。このフィルタ関数により、`.`で始まるファイルやディレクトリはコピーされません。

コピー操作の進捗を表示する

import time

def progress(src, dst):
    print(f"Copying {src} to {dst}")
    shutil.copy2(src, dst)
    time.sleep(0.2)  # 擬似的な処理時間

# コピー操作の進捗を表示
shutil.copytree('src_folder', 'dst_folder', copy_function=progress)

この例では、コピー操作の進捗を表示するための関数`progress`を定義しています。

まとめ

Pythonのshutilモジュールを使えば、ディレクトリのコピーが非常に容易になります。また、多くの応用例を通じて、その汎用性と強力な機能を確認できました。特に、フィルタやプログレス表示などの高度な機能も簡単に実装できるため、多くの場面で役立つでしょう。

コメント

コメントする

目次