Ccmmutty logo
Commutty IT
2 min read

Pythonでディレクトリ構成をコピーする

https://cdn.magicode.io/media/notebox/blob_rz8RUro

はじめに

Pythonを使って色々な作業をしていると「sourceディレクトリ以下の構成をtargetディレクトリ以下に丸々コピーしたい」という処理が時々あります。 そんな時に便利に使える関数を考えました。

プログラム

from pathlib import Path

def get_dir_pair(source_dir: Path, target_dir: Path):
    for source_sub_dir in source_dir.glob('**'):
        if not source_sub_dir.is_dir():
            continue

        target_sub_dir = target_dir.joinpath(source_sub_dir.relative_to(source_dir))
        target_sub_dir.mkdir(parents=True, exist_ok=True)

        yield source_sub_dir, target_sub_dir

説明

標準ライブラリのpathlibを利用しています。 get_dir_pair()関数はsource_dir引数に指定したディレクトリ以下の構成をtarget_dirに指定したディレクトリ以下にコピーし、さらにそれらのパスを1つずつ返すジェネレータ関数となっています。本当にただディレクトリ構成をコピーしたいだけであれば
if __name__ == '__main__':
    source_dir = Path('コピー元ディレクトリのパス')
    target_dir = Path('コピー先ディレクトリのパス')
    for _ in get_dir_pair(source_dir, target_dir):
        pass
とするか、get_dir_pair()関数のyield文を削除すると良いです。
ジェネレータとして実装すると、下の例のような使い方が出来るという利点があります。
def process_csv(original_csv_path: Path, processed_csv_save_path: Path) -> None:
    # `original_csv` に何かしらの処理を行って `processed_csv_save_path` に保存する関数

if __name__ == '__main__':
    source_dir = Path('コピー元ディレクトリのパス')
    target_dir = Path('コピー先ディレクトリのパス')

    for src, tgt in get_dir_pair(source_dir, target_dir):
        # 1. サブディレクトリ中のCSVファイルを取り出す
        for f in src.glob('*.csv'):
            # 2. そのCSVファイルを処理して`target_dir`中に作成した同じサブディレクトリに保存する。
            save_path = tgt.joinpath(f.name)
            process_csv(f, save_path)

まとめ

今回のプログラムが地味な手作業を削減する役に立てば幸いです。

Discussion

コメントにはログインが必要です。