【python入門】os.walkを使ってディレクトリ走査をしてみよう!

今日はos.walk()の使い方について説明いたします。

os.walk()はファイルを走査する際に使用するモジュールで、ファイル一覧を表示する際などに活用できます。

今回の記事では、

・os.walk()の使い方
・特定の拡張子のファイル一覧を表示する方法
・特定のディレクトリを除外する方法

について説明させていただきます。

ぜひ、最後までお付き合いください。

本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。

→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説

なお、その他のPythonの記事についてはこちらにまとめています。

目次

os.walk()の使い方

まず、os.walk()をどのように使うか、

またどのように処理されるかを確認しましょう。

os.walk()を使用するには、“os”をインポートする必要があります。

その後os.walk()に開始するディレクトリを指定して呼び出す事で実行できます。

そこで、以下のような構造を持ったtextディレクトリを走査してみます。

test/
┣ dirA
┃ ┣ a-1.txt
┃ ┣ a-2.txt
┃ ┗ dirD/
┃ ┗ d-1.txt

┣ dirB/
┃ ┣ b-1.py
┃ ┗ b-2.py

┗ dirC/
┣ c-1.txt
┗ c-2.txt

コード:

#! /usr/bin/env python

import os

for curDir, dirs, files in os.walk("test"):
    print('===================')
    print("現在のディレクトリ: " + curDir)
    print("内包するディレクトリ:" + dirs)
    print("内包するファイル: " + files)

実行結果:

===================
現在のディレクトリ: test
内包するディレクトリ: ['dirB', 'dirC', 'dirA']
内包するファイル: []
===================
現在のディレクトリ: test/dirB
内包するディレクトリ: []
内包するファイル: ['b-2.py', 'b-1.py']
===================
現在のディレクトリ: test/dirC
内包するディレクトリ: []
内包するファイル: ['c-1.txt', 'c-2.txt']
===================
現在のディレクトリ: test/dirA
内包するディレクトリ: ['dirD']
内包するファイル: ['a-2.txt', 'a-1.txt']
===================
現在のディレクトリ: test/dirA/dirD
内包するディレクトリ: []
内包するファイル: ['d-1.txt']

上記のように、デフォルトでは指定したディレクトリからトップダウンの流れでディレクトリを走査します。

戻り値は

・ディレクトリ名:String
・内包するディレクトリ一覧:list
・内包するファイル一覧:list

となります。

もし末端のディレクトリからボトムアップの流れでディレクトリ走査をしたい場合は、“topdown=False”を引数に入れる事で変更可能です。

#! /usr/bin/env python

import os

for curDir, dirs, files in os.walk("test", topdown=False):
    print('===================')
    print("現在のディレクトリ: " + curDir)
    print("内包するディレクトリ:" + dirs)
    print("内包するファイル: " + files)

これを実行すると、

===================
現在のディレクトリ: test/dirB
内包するディレクトリ: []
内包するファイル: ['b-2.py', 'b-1.py']
===================
現在のディレクトリ: test/dirC
内包するディレクトリ: []
内包するファイル: ['c-1.txt', 'c-2.txt']
===================
現在のディレクトリ: test/dirA/dirD
内包するディレクトリ: []
内包するファイル: ['d-1.txt']
===================
現在のディレクトリ: test/dirA
内包するディレクトリ: ['dirD']
内包するファイル: ['a-2.txt', 'a-1.txt']
===================
現在のディレクトリ: test
内包するディレクトリ: ['dirB', 'dirC', 'dirA']
内包するファイル: []

上記のようになり、配下にディレクトリがある場合はそちらを優先して走査するようになります。

ファイル一覧を取得する方法

ディレクトリ走査のやり方がわかったところで、ファイル一覧の取得を行ってみましょう。

ファイル一覧を表示する

os.walk()は戻り値として、

・ディレクトリ名
・内包するディレクトリリスト
・内包するファイルリスト

が表示されるため、このファイルリストをさらにfor文で回すことにより、ファイルの一覧の取得が可能となります。

具体的には以下のように実装します。

#! /usr/bin/env python

import os

for curDir, dirs, files in os.walk("test"):
    for file in files:
        print(os.path.join(curDir, file))

実行結果:

b-2.py
b-1.py
c-1.txt
c-2.txt
a-2.txt
a-1.txt
d-1.txt

特定の拡張子のファイル一覧を表示する

続いて、特定の拡張子のファイルを表示する方法を紹介します。

#! /usr/bin/env python

import os

for curDir, dirs, files in os.walk("test"):
    for file in files:
        if file.endswith(".txt"):
            print(os.path.join(curDir, file))

実行結果:

c-1.txt
c-2.txt
a-2.txt
a-1.txt
d-1.txt

“test”配下の”.txt”ファイルをリストアップすることができました。

特定のファイルのパスを表示する

今度は、特定のファイルのパスを表示してみましょう。

これにより、ファイル検索が実現されます。

実際の例が以下になります。

#! /usr/bin/env python

import os

for curDir, dirs, files in os.walk("test"):
    for file in files:

if “d-1.txt” in file:
print(os.path.join(curDir, file))

実行結果:

test/dirA/dirD/d-1.txt

該当するファイルのパスを取得する事ができました。

ディレクトリ一覧を取得する方法

今度は、ディレクトリ一覧を取得する方法を紹介します。

ディレクトリ一覧を表示する

ディレクトリ一覧を表示する際もやり方はファイルと同様で、ディレクトリリストをfor文で回す事で実現します。

具体的にには、以下のようにします。

#! /usr/bin/env python

import os

for curDir, dirs, files in os.walk("test"):
    for dir in dirs:
        print(dir)
dirB
dirC
dirA
dirD

特定の文字列を含むディレクトリを除外する

今度は、特定のディレクトリを除外する方法を紹介します。

要領はディレクトリ一覧を表示する際にディレクトリ名を確認し、それに一致するディレクトリは表示しないようにします。

実際の例は以下になります。

#! /usr/bin/env python

import os

for curDir, dirs, files in os.walk("test"):
    for dir in dirs:
        if "dirA" not in dir:
            path = os.path.join(curDir, dir)
            print(path)

実行結果:

dirB
dirC
dirD

“dirA”をリストから除外する事ができました。

また、dirA配下のdirCも除外したいときは、”curDir”の箇所も活用すれば実現可能です。

まとめ

いかがでしたでしょうか?

今回の記事では、

・os.walk()の使い方
・特定の拡張子のファイル一覧を表示する方法
・特定のディレクトリを除外する方法

について説明いたしました。

os.walk()を使用すると、ディレクトリ走査やファイルのリストアップなどが簡単に実装する事ができます。

また、応用するとソートなども可能になります。

os.walk()をうまく使って、ディレクトリ走査を活用してください!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次