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爆速講座