はじめに
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)
まとめ
今回のプログラムが地味な手作業を削減する役に立てば幸いです。