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