このブログはWindowsパソコンでPythonを実行している想定になっています。
globモジュールのインストール
Pythonでフォルダ内のファイル一覧を取得する方法を、globモジュールを使って説明します。
globモジュールは「ワイルドカード(*
や ?
)」を使って、ファイル名をパターンで探せる便利なモジュールです。
Pythonによる自動化を行う為に、入力ファイルの一覧を取得するための必須スキルです。
import glob
このコードを読み込む前に、glob関係の処理は実行できません。
通常はプログラムの先頭に記載します。そのためプログラムの先頭にはimport文が複数並ぶことが多くなります。
【脇道】プログラムエディタ(VSCode)での警告・エラー表示
- globの下部に波線で警告が出ます。
- 問題タブでは、「”glob” が定義されていません」と警告表示が出ます。
- プログラム実行すると「例外が発生しました: NameError name ‘glob’ is not defined」とエラーになります。
パターンを指定してファイル一覧を取得する
たとえば、プログラムのpyファイルと同じフォルダにある .txt
ファイルを全部探す場合
file_list = glob.glob('*.txt')
print(file_list)
*.txt
は「拡張子が .txt
のファイルを全部探す」という意味です。print(file_list)の出力結果です。
['a.txt', 'b.txt']
プログラムを実行したpyファイル(C:\example\blog_glob.py)と同じフォルダに a.txt と b.txt がありました。
フォルダを指定する
例えば、C:\example\
フォルダ内の .
txt ファイルを探す場合:
file_list = glob.glob('C:\\example\\*.txt')
print(file_list)
print(file_list)の出力結果です。先ほどとは異なりフルパス表示になります。
['C:\\example\\a.txt', 'C:\\example\\b.txt']
サブフォルダも含めて探す場合
サブフォルダも含めて全部探すときは **
と recursive=True
を使います。
file_list = glob.glob('C:\\example\\**\\*.txt', recursive=True)
print(file_list)
print(file_list)の出力結果です。
['C:\\example\\a.txt', 'C:\\example\\b.txt', 'C:\\example\\folder\\c.txt', 'C:\\example\\folder\\d.txt']
ちょっと解りにくいので、手作業で [ ] ‘ , を消して、1ファイルごとに改行しました。
C:\\example\\a.txt
C:\\example\\b.txt
C:\\example\\folder\\c.txt
C:\\example\\folder\\d.txt
プログラムを実行したpyファイルと同じフォルダに a.txt と b.txt 、folderファルダの下に c.txt d.txt ファイルが有りました。手作業では大変なので、コードで実行します。
for file in file_list:
print(file)
print(file)の出力結果です。
C:\example\a.txt
C:\example\b.txt
C:\example\blog_glob.py
C:\example\folder
手作業のときはフォルダは\\表記でしたが、print(file)の結果は\表記でした。プログラムコードでは\\または/で記載します。globモジュールでの結果は、Windowsパソコンだとフォルダは\\表記になります。現時点では細かいことは気にせず、「そういうもんなんだ」と認識でいいと思います。
Pythonプログラムではフォルダの表記方法は、いくつかあります。
'C:\\example\\a.txt'
'C:/example/a.txt'
'C:\\example/a.txt'
'C:/example\\a.txt'
r'C:\example\\a.txt'
個人的にはコードの中では/表記(上から2番目)で記載しています。なのでglobモジュールの実行結果は上から4番目の表記になります。
まとめ
import glob
# フォルダ内のすべてのファイルを取得
file_list = glob.glob('*.txt')
print(file_list)
print('---------------------')
# フォルダ内のすべてのファイルを取得
file_list = glob.glob('C:/example/*.txt')
print(file_list)
print('---------------------')
# フォルダ内のすべてのファイルを取得(失敗パターン)
file_list = glob.glob('C:/example/*.txt', recursive=True)
print(file_list)
print('---------------------')
# フォルダ内のすべてのファイルを取得(成功パターン)
file_list = glob.glob('C:/example/**/*.txt', recursive=True)
print(file_list)
print('---------------------')
print('フォルダ内のファイル一覧:')
for file in file_list:
print(file)
出力結果です。
['a.txt', 'b.txt']
---------------------
['C:/example\\a.txt', 'C:/example\\b.txt']
---------------------
['C:/example\\a.txt', 'C:/example\\b.txt']
---------------------
['C:/example\\a.txt', 'C:/example\\b.txt', 'C:/example\\folder\\c.txt', 'C:/example\\folder\\d.txt']
---------------------
フォルダ内のファイル一覧:
C:/example\a.txt
C:/example\b.txt
C:/example\folder\c.txt
C:/example\folder\d.txt
以上、globモジュールの使い方でした。