Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでディレクトリツリー構造を一覧表示する方法【os.walkの使い方】

Pythonでディレクトリツリーを一覧表示するには?

Pythonでフォルダ(ディレクトリ)の中身をツリー構造として一覧表示したい場合は、標準ライブラリの os.walk() メソッドを使うのが最も簡単です。os.walk() は、指定したパス以下のすべてのサブディレクトリとファイルを再帰的に走査し、そのたびに「現在のディレクトリパス」「含まれるサブディレクトリの一覧」「含まれるファイルの一覧」をタプルとして返してくれます。

この仕組みを利用すれば、各要素のパスを os.path.join() で連結することで、すべてのファイルやフォルダの絶対パス(または相対パス)を取得できます。

基本的なコード例

import os

def tree_printer(root):
    for root, dirs, files in os.walk(root):
        for d in dirs:
            print(os.path.join(root, d))
        for f in files:
            print(os.path.join(root, f))

tree_printer('.')

このコードでは、tree_printer() 関数に起点となるパス(ここではカレントディレクトリを表す '.')を渡しています。ループが回るごとに、まずその階層にあるディレクトリ名、続いてファイル名が出力されます。

実行結果の例

上記のコードを実行すると、次のようにディレクトリが先に出力され、その後に各ディレクトリ内のファイルパスが再帰的に表示されます。

C:\hello\my_folder
C:\hello\another_folder
C:\hello\my_folder\abc.txt
C:\hello\my_folder\xyz.txt
C:\hello\another_folder\new.txt
...

pathlibを使ったモダンな書き方

Python 3.4以降では、より直感的に書ける pathlib モジュールを使う方法もおすすめです。

from pathlib import Path

def tree_printer(root):
    for path in Path(root).rglob('*'):
        print(path)

tree_printer('.')

rglob('*') を使うことで、すべての子ディレクトリ・ファイルを再帰的に取得できます。コードがシンプルになり、OSごとのパス区切りの違いも自動的に吸収されるため、可読性と移植性の両面でメリットがあります。

まとめ

  • ディレクトリツリーの一覧表示には os.walk() が定番。
  • os.path.join() でパスを連結すると、環境に依存しない正しいパスが得られる。
  • Python 3.4以降なら pathlib.Path.rglob() を使うとさらに簡潔に書ける。

用途に応じて使い分けることで、ファイルシステムの走査処理を効率的に実装できます。

  1. Pythonで方向リストを使って二分木を走査するプログラム

    二分木と、R(右)、L(左)、U(上)からなる文字列のリスト moves が与えられているとします。ルートから出発し、moves の各指示に従って木をたどります。R は右の子ノードへ移動、L は左の子ノードへ移動、U は親ノードへ戻ることを意味します。例えば、次のような二分木があったとします。入力が [R, R, U, L] の場合、出力は 3 になります。解決のアプローチこの問題は、通過したノードの履歴をスタック(リスト)で管理することで解決できます。手順は以下の通りです。空のリスト past を用意します。moves 内の各移動指示に対して、以下を繰り返します。まず現在のノードを past

  2. Pythonで二分木を反転する方法:再帰を使った実装を解説

    二分木の反転とは二分木が与えられたとき、その左右の子ノードを入れ替えて「鏡像」のような木を作ることを二分木の反転(Invert Binary Tree)と呼びます。これはアルゴリズムの学習やコーディング面接でも頻出のトピックです。例えば、次のような二分木があったとします。これを反転すると、すべてのノードの左部分木と右部分木が入れ替わり、以下のような木になります。解き方:再帰的アプローチこの問題は再帰を使うと非常にシンプルに解けます。考え方は以下の3ステップです。ルートが None(null)であれば、そのまま返す(ベースケース)現在のノードの左ポインタと右ポインタを入れ替える左部分木と右部分木