Pythonで指定したディレクトリ内のサブディレクトリ・ファイル一覧の取得は簡単にできます。
では、条件を設定し、その条件に合致したファイルのみを取得する場合はどうしたら良いのでしょう。
“複数のファイル、且つ拡張子もバラバラ”そんなディレクトリから、特定の拡張子だけのファイルを取り出したい
パス文字列の分割やif文を使えば、その様な処理は難しいものではありませんが、ファイルを取り出すだけの処理はもっと簡便にしたい。
Pythonには、拡張子を指定したファイルの取得が一行で書けてしまう関数 glob.glob() があります。
この関数 glob.glob() を使えば、ファイルの取得だけの為に、パス文字列の分割やif文処理をする必要はありません。
|
[g_ad_double_codecamp]
Pythonで特定の拡張子だけのファイル情報を取得
Pythonでディレクトリ内の一覧を取得するには os.listdir() を使用するのが最も簡単
テスト用のディレクトリ「D:/liquidjumper/」直下のサブディレクトリ・ファイルの一覧をos.listdir()で取得してみましょう。
os.listdir()にディレクトリのパスを指定、返されるディレクトリ内の一覧のリストを[dir_list]に代入。
for文で[dir_list]からディレクトリ名・ファイル名を取り出し、os.path.join()でフルパスに変換。print()で出力。
import os
dir_path = "D:/liquidjumper/"
dir_list = os.listdir(dir_path)
for i in range(len(dir_list)):
print(os.path.join(dir_path,dir_list[i]))
実行:
ディレクトリ「D:/liquidjumper/」直下のサブディレクトリ・ファイル一覧が出力されました。
D:/liquidjumper/csv_test.csv
D:/liquidjumper/csv_test2.csv
D:/liquidjumper/csv_test_e.csv
D:/liquidjumper/csv_test_j.csv
D:/liquidjumper/csv_test_new.csv
D:/liquidjumper/json_file.json
D:/liquidjumper/json_file_new.json
D:/liquidjumper/newdir
D:/liquidjumper/new_textfile.txt
D:/liquidjumper/textfile_shift_jis.txt
D:/liquidjumper/textfile_utf8.txt
D:/liquidjumper/todofuken.xls
D:/liquidjumper/todofuken.xlsx
D:/liquidjumper/wakayama.xls
|
特定のファイル拡張子だけのファイル一覧を取得
os.listdir()でディレクトリ直下の一覧を取得できましたが、特定の拡張子限定でファイルを取得するにはどうしたら良いのでしょう。
Pythonは、os.pathモジュールの関数 splitext() でファイルパスから拡張子を分割する事ができます。
この関数でファイル名から拡張子を取得、if文で判定すれば、指定した拡張子だけを取得できそう。
for文で[dir_list]から取り出したファイル名を、os.path.splitext()[1]に指定、拡張子を取得。
if文で拡張子[.txt]と合致した場合のみ、print()出力。
import os
dir_path = "D:/liquidjumper/"
dir_list = os.listdir(dir_path)
for i in range(len(dir_list)):
if ".txt" == os.path.splitext(dir_list[i])[1]: ## os.path.splitext()[1]で拡張子を取得
print(os.path.join(dir_path, dir_list[i]))
実行:
if文で拡張子を判定。[.txt]ファイルだけを出力できました。
D:/liquidjumper/new_textfile.txt
D:/liquidjumper/textfile_shift_jis.txt
D:/liquidjumper/textfile_utf8.txt
|
Pythonでワイルドカードを指定しファイルの拡張子を限定
if文を使えば、拡張子を限定してファイルを取得する事はできますが、globモジュールを使えばもっと簡単に拡張子を限定する事ができます。
glob.glob()
にワイルドカードを追記したディレクトリパスを指定するだけ
ワイルドカードを指定して特定の拡張子だけのファイル一覧を取得
「*txt」「*jpg」「*pdf」など先頭に「*」を付けた拡張子をディレクトリパスに追記
そのディレクトリパスをglob.glob()に指定する
glob.glob(“D:/liquidjumper/*txt”)
これだけで、指定した拡張子のみのファイルを取得できます。
if文で拡張子を判定する必要もありません。
import glob
dir_path = "D:/liquidjumper/*txt" ##ワイルドカードを設定「*txt」
txt_files = glob.glob(dir_path) ##拡張子が「*txt」だけのファイルを返す
for file_name_i in txt_files:
print(file_name_i)
実行:
様々な拡張子のファイルを含むディレクトリから、指定した拡張子[.txt]のファイルだけを取得できました。
D:/liquidjumper\new_textfile.txt
D:/liquidjumper\textfile_shift_jis.txt
D:/liquidjumper\textfile_utf8.txt
ワイルドカードを指定して特定の拡張子だけのファイルサイズを取得
glob.glob()を使用すれば拡張子で限定したファイル処理も簡単
試しに、様々な拡張子のファイルが混ざったディレクトリから、拡張子を限定しファイルサイズの合計を取得してみましょう。
ディレクトリパスに「*txt」を追記し、glob.glob()で拡張子[.txt]のファイルだけを取得、os.path.getsize()でファイルサイズを確認します。
import os
import glob
dir_path = "D:/liquidjumper2/*txt" ##ワイルドカードを設定「*txt」
txt_files = glob.glob(dir_path)
full_size = 0
for file_name_i in txt_files:
file_size = os.path.getsize(file_name_i)
print("{0} : {1}byte".format(file_name_i,file_size))
full_size += file_size
print("合計サイズ : {}byte".format(full_size))
実行:
様々な拡張子のファイルが混ざったディレクトリから、拡張子[.txt]のファイルだけの合計サイズを取得しました。
D:/liquidjumper2\new_textfile.txt : 171byte
D:/liquidjumper2\textfile_shift_jis.txt : 56byte
D:/liquidjumper2\textfile_utf8.txt : 66byte
合計サイズ : 293byte
|
まとめ:globモジュールで拡張子を限定
Pythonで拡張子を判別してファイル情報を取得する方法を紹介しました。
ディレクトリ直下の一覧を取得する関数 os.listdir() でも、 os.path.splitext() でファイルパスと拡張子を分割し、if文で判別すれば、拡張子を限定したファイルの取得も可能です。
しかしglobモジュールの glob.glob() であれば、ファイルパスと拡張子の分割も、if文で判別する処理も無く、指定した拡張子だけのファイルを取得できます。
■globモジュールで拡張子を限定しファイルを取得
「*txt」「*jpg」「*pdf」など先頭に「*」を付けた拡張子の文字列をディレクトリパスに追記しglob.glob()に指定
glob.glob(“D:/liquidjumper/*txt”)
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|
|
|