【Python入門】globモジュールでパス(ファイル/フォルダ名)を取得する方法について解説
Pythonでフォルダやファイルのパス(所在)を扱う場合、標準ライブラリであるglob
モジュールを使用します。
glob
内の関数を活用すれば、指定した条件に一致するパスの取得が可能です。
この記事では、globモジュールでパス(フォルダ/ファイル名)の指定や取得を行う方法について解説していきます。
基本の使い方
glob
モジュール内にあるglob()
関数を使用すると、条件に合致したパス名を取得してリスト(list型)を作成できます。
glob()
関数を使用する際は、括弧()内にパスの取得条件を記述します。
また、glob
モジュールは標準ライブラリのため、冒頭でimport
文による読み込みが必要となります。
import glob # globモジュールを読み込み
# globモジュールのglob関数にて、指定したパスを取得
glob.glob(r"C:\Test\Data\test_1.txt")
パスの記述方法
glob()
関数にてパス(所在)の取得条件を指定する場合は、絶対パスあるいは相対パスにて記述します。
- 絶対パス…ファイルの所在位置を省略せずに記述したもの
- 相対パス…基準となる地点から見た所在位置を記述したもの
また、パスを指定時に通常の文字列で記述してしまうと、区切り文字(\
など)を正しく認識できずエラーになる場合があります。
そのため、指定にはraw文字列を用いて設定を行うのがおすすめです。
r文字列では、文字列の前に「r」あるいは「R」を付ける形で記述します。
import glob # globモジュールを読み込み
# globモジュールのglob関数にて、指定した相対パスを取得
glob.glob(r"Data\test_1.txt")
複数条件の指定方法(正規表現)
glob()
関数を用いて複数のパスを取得したい場合は、正規表現にて条件の指定を行います。
glob()
関数とあわせて使用する正規表現には、主に以下の種類があります。
正規表現 | 記述例 | 説明 |
---|---|---|
* | C:\Test\Data\* .txt | 0文字以上の文字列を含む(内容は問わない) |
** | C:\** \test_1.txt | 0つ以上の階層(フォルダ)を含む ※引数の設定が必要( recursive=True ) |
? | C:\Test\???? \test_1.txt | 任意の1文字を含む(内容は問わない) |
[] | C:\Test\Data\test_[0-9] .txt | []内の文字列のうち、任意の1文字を含む (例: [a-z] 、[5-7] など) |
なお、**
を用いた指定では、オプション引数であるrecursive
もあわせて設定が必要です。
その場合は、パスの取得条件とともにカンマ(,
)区切りでrecursive=True
を記述します。
import glob # globモジュールを読み込み
# globモジュールのglob関数にて、Testフォルダにある「*_1.txt」のパスを取得して表示
print(glob.glob(r"C:\Test\Data\*_1.txt"))
# globモジュールのglob関数にて、「test_*.txt」のパスを取得して表示
print(glob.glob(r"C:\Test\**\test_*.txt", recursive=True))
= 実行結果 =
['C:\\Test\\Data\\test_1.txt']
['C:\\Test\\Data\\test_1.txt', 'C:\\Test\\Data\\test_2.txt']
globモジュールを使った応用例
この先では、glob()
関数を用いた応用例として、フォルダ(ディレクトリ)名・ファイル名のみを取得する方法について紹介します。
パスから抽出を行う場合、同じ標準ライブラリであるos
モジュールを併用します。
ファイル名のみ取得する方法
ファイル名のみを取得する場合は、os.path
モジュールに含まれるbasename()
関数を使用します。
basename()
では、指定されたパスより末尾の要素のみの取得が可能です。
(ここで言う「要素」とは、\
で区切られた文字列を指すものとします)
そのためには、事前にglob()
関数で末尾がファイル名のパスを取得しておく必要があります。
ファイル形式を問わず取得したい場合は「~\*.*」を、決まっている場合は「~\*.jpg」のように指定することで、末尾に拡張子を含むパスのみを抽出可能です。
import os # osモジュールを読み込み
import glob # globモジュールを読み込み
# globモジュールのglob関数にて、「*.txt」ファイルのパスを取得して変数(ls)に保持
ls = glob.glob(r"C:\Test\**\*.txt", recursive=True)
for i in ls: # ls(globの取得結果)の要素ごとに、以下を繰り返し実行
print(os.path.basename(i)) # basename関数にて末尾の要素(ファイル名)を取得し表示
= 実行結果 =
test_1.txt
test_2.txt
glob()
の結果はリスト(list型)のため、for
文にて各パスごとに処理する必要があります。
フォルダ(ディレクトリ)名のみ取得する方法
今回は、特定のファイルを含むパスに対し、それらが配置されているフォルダ(ディレクトリ)名を取得する場合を考えます。
フォルダ名のみを取得する場合は、dirname()
関数とbasename()
関数を併用します。
まず、glob()
関数にて「~\*.*」あるいは「~\*.jpg」といった指定を行い、末尾に拡張子を含むパスのみを取得します。
その後、os.path
モジュールを使用し、以下の順番でフォルダ名のみの取得を行います。
glob()
の結果に対し、dirname()
関数でファイル名以前のパスを抽出するbasename()
関数にて、末尾の要素(最下層のフォルダ名)のみを取得する
import os # osモジュールを読み込み
import glob # globモジュールを読み込み
# globモジュールのglob関数にて、「*.txt」ファイルのパスを取得して変数(ls)に保持
ls = glob.glob(r"C:\Test\Data\*.txt")
for i in ls: # ls(globの取得結果)の要素ごとに、以下を繰り返し実行
folder = os.path.dirname(i) # dirname関数にて末尾の要素(ファイル名)以前を取得し、変数(folder)に保持
print(os.path.basename(folder)) # folderより末尾の要素(最下層のフォルダ)を取得して表示
print("【対象パス】", i) # basename関数の対象となっているパスを表示
= 実行結果 =
Data
【対象パス】 C:\Test\Data\test_1.txt
Data
【対象パス】 C:\Test\Data\test_2.txt
glob()
の結果はリスト(list型)のため、for
文にて各パスごとに処理する必要があります。
まとめ
この記事では、glob
モジュールでパス(ファイル/フォルダ名)の指定や取得を行う方法について解説しました。
特に、open
関数などでファイル読み込みを行う場合には、動的なパスの取得が必要になることもあります。
それ以外でもglob
モジュールを使用する場面は様々あるので、日頃から使い慣れておくことをおすすめします。