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

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

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

今回の記事では、

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

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

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

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()をうまく使って、ディレクトリ走査を活用してください!

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

遠藤貴大

1991年生まれ。双子座。
理系大学で認証システムを学んだ後、アプリ開発者となる。
新しく学ぶ人に寄り添った記事を心がけて執筆します。
芸術が好き。いつか猫と暮らすのが夢。

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー