liquidjumper Python Python-サブディレクトリを含めたディレクトリ配下の全ファイル一覧を取得する方法

Python-サブディレクトリを含めたディレクトリ配下の全ファイル一覧を取得する方法

python_os-walk_subdirectory_get-files_topimage

Pythonで指定したディレクトリ配下のファイル一覧を取得する場合

・os.listdir()
・os.scandir()
・glob.glob()

これらの関数で簡単に処理できます。

しかし、これらの関数だけでは処理できない問題があります。

ディレクトリ直下にあるディレクトリ・ファイルのみしか取得できず、サブディレクトリがある場合、その配下のファイルは取得できない

つまり、サブディレクトリがある階層構造の場合、指定したディレクトリ配下の全てのディレクトリやファイルにアクセス出来ないということ。

次のような階層のディレクトリの場合、「D:/liquidjumper」を指定すると「D:/liquidjumper」直下のファイルのサイズしか取得できず、「image」と「video/mov」の中にあるファイルのサイズはカウントされません。

D:/liquidjumper
│  new_textfile.txt
│  textfile_shift_jis.txt
│  textfile_utf8 – コピー.txt
│  textfile_utf8.txt
│  todofuken.xls
│  todofuken.xlsx
│  wakayama.xls

├─audio
├─image
│      techgym_01.jpg
│      techgym_02.jpg
│      techgym_03.jpg

└─video
    └─mov
            M07_008.MOV


勿論 os.listdir() 等の関数でも工夫すればサブディレクトリ配下を含む全てのファイルにアクセスし取得する事は可能ですが、

if文でサブディレクトリが見つかった場合はその直下のファイルを取得、その中にもディレクトリがある場合は…

の様な処理をする必要があり、ファイル一覧を取得するだけなのに非効率に感じるところ。


Pythonにはディレクトリのサブディレクトリまで探索してくれる関数 os.walk() があります。

この関数を使用すると、複雑な階層構造のディレクトリでも、簡単に配下の全ファイルにアクセスできるので非常に便利。

そこで今回は、Pythonのos.walk()関数でサブディレクトリを含めたディレクトリ配下のファイル一覧を取得する方法を紹介します。


Pythonでサブディレクトリを含めたディレクトリ配下のファイル一覧を取得する

Pythonの osモジュールには、指定したディレクトリのサブディレクトリまで探索してくれる便利な関数 

os.walk() 

があります。

os.walk()でサブディレクトリを含めたディレクトリ配下のリストを取得

os.walk()にディレクトリパスを指定すると、

1.指定したディレクトリ直下のファイルのリストとサブディレクトリのリスト
2.サブディレクトリ配下のサブディレクトリのリストとファイルのリスト
3.サブディレクトリ配下のサブディレクトリ直下のサブディレクトリのリストとファイルのリスト


と、順番に階層構造のディレクトリを隈なく探索し次の3つの情報を返します。

・現在のディレクトリのパス
・現在のディレクトリの中のサブディレクトリのリスト
・現在のディレクトリ内のファイルのリスト


試しに、os.walk()にディレクトリパス「D:/liquidjumper」を指定して、どの様な情報が返されるのか確認してみましょう。

os.walk()で指定したディレクトリパス配下のディレクトリとファイルの情報を取得するにはfor文を使用します。


for [current_dir], [sub_dirs], [files_list] in os.walk(ディレクトリパス):


for文でos.walk()で取得したリストを、

・[current_dir](現在のディレクトリのパス)
・[sub_dirs](現在のディレクトリの中のサブディレクトリのリスト)
・[files_list](現在のディレクトリ内のファイルのリスト)

に振り分け、printで出力します。

import os


dir_path = "D:/liquidjumper" 

for current_dir, sub_dirs, files_list in os.walk(dir_path): 
    print(u"現在のディレクトリは {} です".format(current_dir)) 
    print(u"サブディレクトリは {} です".format(sub_dirs)) 
    print(u"ディレクトリ内のファイルは {} です".format(files_list)) 
    print("//////////////////////////////////////////////")


実行:

各階層のディレクトリ毎に、サブディレクトリのリスト、ファイルのリストが出力されているのが確認できます。

現在のディレクトリは D:/liquidjumper です
サブディレクトリは [‘audio’, ‘image’, ‘video’] です
ディレクトリ内のファイルは [‘etixAutoSalon.pdf’, ‘new_textfile.txt’, ‘textfile_shift_jis.txt’, ‘textfile_utf8 – \x83R\x83s\x81[.txt’, ‘textfile_utf8.txt’, ‘todofuken.xls’, ‘todofuken.xlsx’, ‘wakayama.xls’] です
//////////////////////////////////////////////
現在のディレクトリは D:/liquidjumper\audio です
サブディレクトリは [] です
ディレクトリ内のファイルは [] です
//////////////////////////////////////////////
現在のディレクトリは D:/liquidjumper\image です
サブディレクトリは [] です
ディレクトリ内のファイルは [‘techgym_01.jpg’, ‘techgym_02.jpg’, ‘techgym_03.jpg’] です
//////////////////////////////////////////////
現在のディレクトリは D:/liquidjumper\video です
サブディレクトリは [‘mov’] です
ディレクトリ内のファイルは [] です
//////////////////////////////////////////////
現在のディレクトリは D:/liquidjumper\video\mov です
サブディレクトリは [] です
ディレクトリ内のファイルは [‘M07_008.MOV’] です
//////////////////////////////////////////////


os.walk()で取得したファイルをフルパスで取得

では、os.walk()を使って、ディレクトリ内のサブディレクトリを含めた、全ファイルをフルパスで取得してみましょう。

os.walk()で取得した3つの情報から、各階層ディレクトリのファイルのリストをfor文で取り出し、現在のディレクトリパス[current_dir]とファイル名をos.path.join()に指定しフルパスに変換します。

import os


dir_path = "D:/liquidjumper" 

for current_dir, sub_dirs, files_list in os.walk(dir_path): 
  for file_name in files_list: 
    print(os.path.join(current_dir,file_name))


実行:

指定したディレクトリ”D:/liquidjumper”内のサブディレクトリを含む、全てのファイルをフルパスで取得することができました。

D:/liquidjumper2/newdir\dir_tree.txt
D:/liquidjumper2/newdir\new_textfile.txt
D:/liquidjumper2/newdir\textfile_shift_jis.txt
D:/liquidjumper2/newdir\textfile_utf8 – コピー.txt
D:/liquidjumper2/newdir\textfile_utf8.txt
D:/liquidjumper2/newdir\todofuken.xls
D:/liquidjumper2/newdir\todofuken.xlsx
D:/liquidjumper2/newdir\wakayama.xls
D:/liquidjumper2/newdir\image\techgym_01.jpg
D:/liquidjumper2/newdir\image\techgym_02.jpg
D:/liquidjumper2/newdir\image\techgym_03.jpg
D:/liquidjumper2/newdir\video\mov\M07_008.MOV



DMMならではの動画が7000本以上!見放題chライト “"

まとめ:os.walk()でサブディレクトリを含めてファイル一覧を取得する

Pythonでサブディレクトリを含めたディレクトリ配下の全ファイル名を取得する方法を紹介しました。


Pythonでサブディレクトリを含めたディレクトリ配下の値を取得する場合はosモジュールの関数

os.walk()

を使用します。


os.walk()にディレクトリパスを指定しディレクトリとファイルの情報を取得するにはfor文を使用

for [current_dir], [sub_dirs], [files_list] in os.walk(ディレクトリパス):

・現在のディレクトリのパス
・現在のディレクトリの中のサブディレクトリのリスト
・現在のディレクトリ内のファイルのリスト

の3つに分けて取得できます。



Pythonでディレクトリ配下のファイル一覧を取得するのはos.listdir()等の関数で簡単に出来ますが、サブディレクトリの有無がある階層構造の場合は少し手間がかかりますが、osモジュールのos.walk()を使えば、難しい事を考えなくてもサブディレクトリを含むディレクトリ配下の全ファイルにアクセスでき効率的にコードが書けるので、使ってみてください。








SAMURAI ENGINEER Plus+


 月額定額制の完全オンライン・プログラミングスクール

 「SAMURAI TERAKOYA(侍テラコヤ)」

 ・月々定額のサブスクで利用でき、入会金も不要、いつでも退会可能
 ・現役エンジニアの講師とマンツーマン・レッスンで疑問や悩みを解決
 ・オンラインで学べるので地方在住者でも受講可能

侍テラコヤ






𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



あわせてよく読まれている記事