Pythonでファイルとディレクトリの階層構造を表示する方法

この記事では、Pythonを使用してファイルとディレクトリの階層構造を表示する方法について詳しく解説します。具体的なコード例とその解説、さらには多角的な応用例も含めています。

目次

基本的な方法

Pythonでは、`os` モジュールを使用してファイルやディレクトリの操作を行うことができます。`os.walk()`関数は、指定されたディレクトリから始めてその下位のすべてのディレクトリを探索します。

os.walk()の基本的な使い方

`os.walk()`関数は、ディレクトリツリーを上から下へ探索します。この関数は、ディレクトリごとに3つの値(ディレクトリの名前、サブディレクトリのリスト、ファイル名のリスト)をyieldするジェネレータを返します。

import os

def list_files(startpath):
    for root, dirs, files in os.walk(startpath):
        level = root.replace(startpath, '').count(os.sep)
        indent = ' ' * 4 * level
        print(f'{indent}{os.path.basename(root)}/')
        sub_indent = ' ' * 4 * (level + 1)
        for f in files:
            print(f'{sub_indent}{f}')

コードの詳細解説

このコードでは、`os.walk()`関数を使用して指定されたディレクトリの階層構造を探索しています。

– `startpath`: 探索を始めるディレクトリを指定します。
– `root`: 現在探索中のディレクトリ。
– `dirs`: `root` に存在するサブディレクトリのリスト。
– `files`: `root` に存在するファイルのリスト。

階層の深さとインデント

コード内で、`level` という変数に階層の深さを計算させ、それに基づいてインデントを行っています。これにより、視覚的に階層構造を理解しやすくしています。

応用例

以下に、この基本的な方法を応用したいくつかの例を示します。

例1: ファイルサイズを表示する

import os

def list_files_with_size(startpath):
    for root, dirs, files in os.walk(startpath):
        level = root.replace(startpath, '').count(os.sep)
        indent = ' ' * 4 * level
        print(f'{indent}{os.path.basename(root)}/')
        sub_indent = ' ' * 4 * (level + 1)
        for f in files:
            file_path = os.path.join(root, f)
            file_size = os.path.getsize(file_path)
            print(f'{sub_indent}{f} ({file_size} bytes)')

例2: ファイル形式によってフィルターする

import os

def list_files_by_extension(startpath, extension):
    for root, dirs, files in os.walk(startpath):
        for f in files:
            if f.endswith(extension):
                print(os.path.join(root, f))

例3: 特定の階層までしか探索しない

import os
def list_files_limited_depth(startpath, max_depth):
    for root, dirs, files in os.walk(startpath):
        level = root.replace(startpath, '').count(os.sep)
        if level < max_depth:
            print(root)

まとめ

Pythonの`os`モジュールを使用して、簡単にファイルとディレクトリの階層構造を表示できることを学びました。基本的なコード例から、ファイルサイズの表示、特定の拡張子のみを対象にする、特定の階層までしか探索しないといった応用例まで見てきました。

コメント

コメントする

目次