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_dirpathlibを利用しています。
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):
        passget_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)