Pythonでディレクトリ内に含まれているすべてのディレクトリやファイルを取得したいときに使えるのがos.walk関数です。
この関数を使うとすべてのファイルやディレクトリをforループを使って取り出すことができます。
フォルダとディレクトリは同じ意味です。主観ですがディレクトリは「作業スペース」で、フォルダは「ただの入れ物」というイメージが強いです。
os.walk関数とは
osモジュールの関数でディレクトリ内のディレクトリやファイルを取得することができます。
os.walk関数は基本的にfor文でループ処理をしてディレクトリやファイルの名前を取り出します。
os.walk関数はgeneratorオブジェクトを返します。オブジェクトとはデータの種類・性質とそのデータに対してできる処理をまとめて指す言葉です。オブジェクトによってできることとできないことがあるので注意が必要です。
print関数では取り出せない
1 2 3 4 5 6 7 8 9 |
print(os.walk(path)) #出力結果 <generator object walk at 0x00000227C93B4A50> print(os.walk(path)[1]) #出力結果 TypeError: 'generator' object is not subscriptable |
print関数をつかってもこのようにメモリの番号が出てくるだけなので注意が必要です。また、リストのようにインデックスを指定すると「TypeError」になります。generatorオブジェクトにはインデックはありません。
for文での使い方
変数が1つ
階層ごとにタプルに格納される
以下の「blogディレクトリ」をos.walk関数を使って表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
C: │ sample.txt │ スケジュール.xlsx │ │─ folder1 │ ├─ step1.txt │ ├─ step2.txt │ └─ step3.txt │ └─ folder2 ├─ time.txt └─ folder3.txt └─ test.txt |
1 2 3 4 5 6 7 8 |
for i in os.walk(r"C:\blog"): print(i) #出力結果 ('C:\\blog', ['folder1', 'folder2'], ['sample.txt', 'スケジュール.xlsx']) ('C:\\blog\\folder1', [], ['step1.txt', 'step2.txt', 'step3.txt']) ('C:\\blog\\folder2', ['folder3'], ['time.txt']) ('C:\\blog\\folder2\\folder3', [], ['test.txt']) |
タプルには以下の順番で格納されています。
- ディレクトリパス
- 含まれるディレクトリ名のリスト
- 含まれるファイル名のリスト
変数が2つ
2変数では「ValueError」になる
1 2 3 4 5 |
for i,j in os.walk(path): print(i, j) #出力結果 ValueError: too many values to unpack (expected 2) |
変数が3つ
- dirs変数:各ディレクトリのパスを格納
- subdirs変数:各ディレクトリ名を格納
- files変数:各ファイル名を格納
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
for dirs, subdirs, files in os.walk(path): print("ディレクトリ:", dirs) for subdir in subdirs: print("内部のディレクトリ名:", subdir) for file in files: print("ファイル名:", file) print("===============") #出力結果 ディレクトリ: C:\blog 内部のディレクトリ名: folder1 内部のディレクトリ名: folder2 ファイル名: sample.txt ファイル名: スケジュール.xlsx =============== ディレクトリ: C:\blog\folder1 ファイル名: step1.txt ファイル名: step2.txt ファイル名: step3.txt =============== ディレクトリ: C:\blog\folder2 内部のディレクトリ名: folder3 ファイル名: time.txt =============== ディレクトリ: C:\blog\folder2\folder3 ファイル名: test.txt =============== |
このように各階層のディレクトリ名とファイル名を表示することができます。もちろん、階層にディレクトリが存在しない場合は「内部のディレクトリ名」は省略されています。
まとめ
- os.walk関数:ディレクトリツリーを取得
- generatorオブジェクト
- for文でループさせて表示する
- 変数は1個か3個に限る
- ファイル操作で使うosモジュールの関数16個まとめ
- ファイルを読み込む手順【open・close・path・withの使い方】
- ファイルに書き込み・上書き・読み込みする5つの方法【open関数のモード選択】
- フォルダ内のファイル名を取得・名前を変更する方法
- ファイル・フォルダを削除・作成する方法
- 絶対パスと相対パスの判定・変換する方法
- ファイル・フォルダを移動・コピーする方法【shutilモジュールの使い方】
- ファイルを読み込む5通りの方法【リスト・for文・一行ずつ】
- ディレクトリツリーを取得してファイル一覧を表示する方法【os.walkの使い方】
- ファイル・フォルダがあるかどうかの存在確認と判定する方法
プログラミング言語のなかでも人気の高いPythonを学習する教材を紹介します。 最近ではプログラミングスククールがたくさんあるので迷うと思います。 ですが、まずは無料教材から始めてみましょう。苦労した分だけ力がつきます。 […]