Python pathlibでディレクトリ(フォルダ)の作成・削除を行う方法
ディレクトリの作成
mkdir() – 基本的なディレクトリ作成
from pathlib import Path
# 単一ディレクトリの作成
new_dir = Path('new_folder')
new_dir.mkdir()
# 既存ディレクトリがある場合はエラーを無視
new_dir.mkdir(exist_ok=True)
階層ディレクトリの作成
from pathlib import Path
# 親ディレクトリも同時に作成
deep_dir = Path('data/2024/january/reports')
deep_dir.mkdir(parents=True, exist_ok=True)
# Windows形式のパスでも同様
win_path = Path('C:/Users/user/Documents/MyProject/data')
win_path.mkdir(parents=True, exist_ok=True)
権限を指定してディレクトリ作成
from pathlib import Path
import stat
# Unix系OSでの権限指定
secure_dir = Path('secure_folder')
secure_dir.mkdir(mode=0o700, exist_ok=True) # オーナーのみアクセス可能
# 読み取り専用ディレクトリ
readonly_dir = Path('readonly_data')
readonly_dir.mkdir(exist_ok=True)
readonly_dir.chmod(stat.S_IRUSR | stat.S_IXUSR) # 作成後に権限変更
ディレクトリの削除
rmdir() – 空ディレクトリの削除
from pathlib import Path
# 空のディレクトリを削除
empty_dir = Path('empty_folder')
if empty_dir.exists() and empty_dir.is_dir():
empty_dir.rmdir()
shutil.rmtree() – 中身のあるディレクトリの削除
from pathlib import Path
import shutil
# ディレクトリとその中身をすべて削除
target_dir = Path('delete_me')
if target_dir.exists() and target_dir.is_dir():
shutil.rmtree(target_dir)
実用的な使用例
プロジェクト構造の自動作成
from pathlib import Path
def create_project_structure(project_name):
"""プロジェクトの基本構造を作成"""
base_dir = Path(project_name)
# 必要なディレクトリを定義
directories = [
'src',
'tests',
'docs',
'data/raw',
'data/processed',
'config',
'logs',
'output'
]
# ディレクトリを作成
for dir_name in directories:
dir_path = base_dir / dir_name
dir_path.mkdir(parents=True, exist_ok=True)
print(f'作成: {dir_path}')
# 初期ファイルも作成
(base_dir / 'README.md').touch()
(base_dir / 'requirements.txt').touch()
(base_dir / '.gitignore').touch()
print(f'プロジェクト "{project_name}" の構造を作成しました')
# 使用例
create_project_structure('my_data_project')
日付別ディレクトリの作成
from pathlib import Path
from datetime import datetime
def create_daily_backup_dir(base_path='backups'):
"""日付別バックアップディレクトリを作成"""
today = datetime.now().strftime('%Y/%m/%d')
backup_dir = Path(base_path) / today
backup_dir.mkdir(parents=True, exist_ok=True)
return backup_dir
def create_log_directory():
"""ログ用の年月ディレクトリを作成"""
now = datetime.now()
log_dir = Path('logs') / str(now.year) / f'{now.month:02d}'
log_dir.mkdir(parents=True, exist_ok=True)
return log_dir
# 使用例
backup_dir = create_daily_backup_dir()
print(f'バックアップディレクトリ: {backup_dir}')
log_dir = create_log_directory()
print(f'ログディレクトリ: {log_dir}')
一時ディレクトリの管理
from pathlib import Path
import tempfile
import shutil
from contextlib import contextmanager
@contextmanager
def temporary_directory(base_path=None):
"""一時ディレクトリのコンテキストマネージャー"""
if base_path:
temp_dir = Path(base_path) / 'temp'
temp_dir.mkdir(parents=True, exist_ok=True)
else:
temp_dir = Path(tempfile.mkdtemp())
try:
yield temp_dir
finally:
if temp_dir.exists():
shutil.rmtree(temp_dir)
# 使用例
with temporary_directory() as temp_dir:
# 一時ディレクトリ内での作業
work_file = temp_dir / 'work.txt'
work_file.write_text('一時的なデータ')
print(f'一時ファイル: {work_file}')
# ここでディレクトリは自動的に削除される
ディレクトリの移動・名前変更
rename() – ディレクトリ名の変更
from pathlib import Path
# ディレクトリ名を変更
old_name = Path('old_folder_name')
new_name = Path('new_folder_name')
if old_name.exists():
old_name.rename(new_name)
print(f'{old_name} を {new_name} に変更しました')
ディレクトリの移動
from pathlib import Path
import shutil
def move_directory(source, destination):
"""ディレクトリを移動"""
source_path = Path(source)
dest_path = Path(destination)
if not source_path.exists():
print(f'移動元が存在しません: {source_path}')
return False
# 移動先の親ディレクトリを作成
dest_path.parent.mkdir(parents=True, exist_ok=True)
# 移動実行
shutil.move(str(source_path), str(dest_path))
print(f'{source_path} を {dest_path} に移動しました')
return True
# 使用例
move_directory('temp_data', 'archive/2024/temp_data')
ディレクトリの情報取得
ディレクトリのサイズ計算
from pathlib import Path
def get_directory_size(dir_path):
"""ディレクトリのサイズを計算"""
path = Path(dir_path)
if not path.is_dir():
return 0
total_size = 0
for file_path in path.rglob('*'):
if file_path.is_file():
try:
total_size += file_path.stat().st_size
except (PermissionError, FileNotFoundError):
continue
return total_size
def format_size(size_bytes):
"""バイトサイズを読みやすい形式に変換"""
if size_bytes < 1024:
return f'{size_bytes} B'
elif size_bytes < 1024**2:
return f'{size_bytes/1024:.1f} KB'
elif size_bytes < 1024**3:
return f'{size_bytes/1024**2:.1f} MB'
else:
return f'{size_bytes/1024**3:.1f} GB'
# 使用例
size = get_directory_size('.')
print(f'ディレクトリサイズ: {format_size(size)}')
ディレクトリ構造の表示
from pathlib import Path
def show_directory_tree(dir_path, max_depth=3, current_depth=0):
"""ディレクトリ構造をツリー形式で表示"""
path = Path(dir_path)
if not path.is_dir() or current_depth >= max_depth:
return
indent = ' ' * current_depth
print(f'{indent}{path.name}/')
try:
for item in sorted(path.iterdir()):
if item.is_dir():
show_directory_tree(item, max_depth, current_depth + 1)
else:
print(f'{indent} {item.name}')
except PermissionError:
print(f'{indent} [アクセス権限なし]')
# 使用例
show_directory_tree('.', max_depth=2)
安全なディレクトリ操作
エラーハンドリング付きディレクトリ作成
from pathlib import Path
import os
def safe_mkdir(dir_path, parents=True, exist_ok=True):
"""安全なディレクトリ作成"""
path = Path(dir_path)
try:
path.mkdir(parents=parents, exist_ok=exist_ok)
print(f'ディレクトリを作成しました: {path}')
return True
except PermissionError:
print(f'権限エラー: {path} を作成できません')
except FileExistsError:
print(f'既に存在します: {path}')
except OSError as e:
print(f'OS エラー: {e}')
return False
def safe_rmdir(dir_path, force=False):
"""安全なディレクトリ削除"""
path = Path(dir_path)
if not path.exists():
print(f'削除対象が存在しません: {path}')
return False
if not path.is_dir():
print(f'ディレクトリではありません: {path}')
return False
try:
if force:
import shutil
shutil.rmtree(path)
else:
path.rmdir() # 空の場合のみ削除
print(f'ディレクトリを削除しました: {path}')
return True
except OSError as e:
print(f'削除エラー: {e}')
return False
# 使用例
safe_mkdir('new_project/data/input')
safe_rmdir('temp_folder', force=True)
まとめ
pathlibを使ったディレクトリ操作は、従来のosモジュールよりも直感的で読みやすいコードが書けます。特にmkdir(parents=True, exist_ok=True)の組み合わせは、階層ディレクトリの作成で非常に便利です。削除処理では適切なエラーハンドリングを行い、予期しないデータ損失を防ぐことが重要です。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座


