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)