フォルダのファイル一覧を取得する(globモジュール)

このブログは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モジュールの使い方でした。