Pythonでファイル・ディレクトリのサイズを取得する方法【os.path.getsize()とpathlib完全解説】

 

Pythonでファイルやディレクトリのサイズを取得したい場面は多くあります。ログファイルの容量確認、ディスク使用量の監視、ファイル整理など様々な用途で必要になる処理です。この記事では、Pythonでファイルやディレクトリのサイズを取得する方法を詳しく解説します。

ファイルサイズの取得方法

os.path.getsize()を使った基本的な方法

最も簡単なファイルサイズ取得方法はos.path.getsize()関数です。

import os

# ファイルサイズを取得(バイト単位)
file_size = os.path.getsize('sample.txt')
print(f'ファイルサイズ: {file_size} bytes')

os.stat()を使った詳細情報取得

より詳細な情報が必要な場合はos.stat()を使用します。

import os

# ファイル統計情報を取得
stat_info = os.stat('sample.txt')
file_size = stat_info.st_size
print(f'ファイルサイズ: {file_size} bytes')

pathlib(Python 3.4以降推奨)での取得

from pathlib import Path

# pathlibでファイルサイズ取得
file_path = Path('sample.txt')
file_size = file_path.stat().st_size
print(f'ファイルサイズ: {file_size} bytes')

ディレクトリサイズの取得方法

ディレクトリの場合、中身のファイルサイズを合計する必要があります。

os.walk()を使った再帰的なサイズ計算

import os

def get_dir_size(path):
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(path):
        for filename in filenames:
            file_path = os.path.join(dirpath, filename)
            total_size += os.path.getsize(file_path)
    return total_size

# ディレクトリサイズを取得
dir_size = get_dir_size('my_folder')
print(f'ディレクトリサイズ: {dir_size} bytes')

pathlibを使ったディレクトリサイズ計算

from pathlib import Path

def get_dir_size_pathlib(path):
    return sum(f.stat().st_size for f in Path(path).rglob('*') if f.is_file())

# pathlibでディレクトリサイズ取得
dir_size = get_dir_size_pathlib('my_folder')
print(f'ディレクトリサイズ: {dir_size} bytes')

サイズの単位変換と表示

人間が読みやすい形式への変換

バイト数を適切な単位(KB、MB、GB)に変換する関数:

def format_size(bytes):
    for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
        if bytes < 1024.0:
            return f"{bytes:.2f} {unit}"
        bytes /= 1024.0

# 使用例
file_size = os.path.getsize('large_file.zip')
print(f'ファイルサイズ: {format_size(file_size)}')

より詳細な単位変換関数

def human_readable_size(size_bytes):
    if size_bytes == 0:
        return "0 B"
    
    size_names = ["B", "KB", "MB", "GB", "TB"]
    import math
    i = int(math.floor(math.log(size_bytes, 1024)))
    p = math.pow(1024, i)
    s = round(size_bytes / p, 2)
    return f"{s} {size_names[i]}"

実践的な使用例

複数ファイルのサイズ一覧表示

import os
from pathlib import Path

def list_file_sizes(directory):
    for file_path in Path(directory).iterdir():
        if file_path.is_file():
            size = file_path.stat().st_size
            print(f'{file_path.name}: {format_size(size)}')

# カレントディレクトリのファイルサイズを表示
list_file_sizes('.')

大きなファイルの検索

def find_large_files(directory, min_size_mb=10):
    min_size_bytes = min_size_mb * 1024 * 1024
    large_files = []
    
    for file_path in Path(directory).rglob('*'):
        if file_path.is_file():
            size = file_path.stat().st_size
            if size > min_size_bytes:
                large_files.append((file_path, size))
    
    return sorted(large_files, key=lambda x: x[1], reverse=True)

# 10MB以上のファイルを検索
large_files = find_large_files('.', 10)
for file_path, size in large_files[:5]:
    print(f'{file_path}: {format_size(size)}')

ディスク使用量の監視

import os
from pathlib import Path

def disk_usage_summary(path):
    total_size = 0
    file_count = 0
    dir_count = 0
    
    for item in Path(path).rglob('*'):
        if item.is_file():
            total_size += item.stat().st_size
            file_count += 1
        elif item.is_dir():
            dir_count += 1
    
    print(f'ディレクトリ数: {dir_count}')
    print(f'ファイル数: {file_count}')
    print(f'総サイズ: {format_size(total_size)}')

# 使用例
disk_usage_summary('.')

エラーハンドリング

ファイルアクセス時のエラー処理:

import os

def safe_get_file_size(file_path):
    try:
        return os.path.getsize(file_path)
    except FileNotFoundError:
        print(f'ファイルが見つかりません: {file_path}')
        return 0
    except PermissionError:
        print(f'アクセス権限がありません: {file_path}')
        return 0
    except OSError as e:
        print(f'OSエラー: {e}')
        return 0

# 安全なファイルサイズ取得
size = safe_get_file_size('unknown_file.txt')

パフォーマンスの考慮

大きなディレクトリを処理する際のパフォーマンス改善:

from pathlib import Path
import concurrent.futures

def get_file_size(file_path):
    return file_path.stat().st_size

def get_dir_size_parallel(directory_path):
    path = Path(directory_path)
    files = [f for f in path.rglob('*') if f.is_file()]
    
    with concurrent.futures.ThreadPoolExecutor() as executor:
        sizes = executor.map(get_file_size, files)
        return sum(sizes)

まとめ

Pythonでファイル・ディレクトリのサイズを取得する主な方法:

  • os.path.getsize(): 単一ファイルの基本的なサイズ取得
  • os.stat(): 詳細な統計情報を含むサイズ取得
  • pathlib: Python 3.4以降の推奨方法
  • os.walk(): ディレクトリの再帰的なサイズ計算

用途に応じて適切な方法を選択し、エラーハンドリングやパフォーマンスにも配慮することで、堅牢なファイルサイズ処理が実現できます。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座