【Python入門】globモジュールでパス(ファイル/フォルダ名)を取得する方法について解説

Pythonでフォルダやファイルのパス(所在)を扱う場合、標準ライブラリであるglobモジュールを使用します。

glob内の関数を活用すれば、指定した条件に一致するパスの取得が可能です。

この記事では、globモジュールでパス(フォルダ/ファイル名)の指定や取得を行う方法について解説していきます。

目次

基本の使い方

globモジュール内にあるglob()関数を使用すると、条件に合致したパス名を取得してリスト(list型)を作成できます。

glob()関数を使用する際は、括弧()内にパスの取得条件を記述します。

また、globモジュールは標準ライブラリのため、冒頭でimport文による読み込みが必要となります。

標準ライブラリ…Pythonをインストールした時点で、標準搭載されているライブラリ

import glob  # globモジュールを読み込み

# globモジュールのglob関数にて、指定したパスを取得
glob.glob(r"C:\Test\Data\test_1.txt")

パスの記述方法

glob()関数にてパス(所在)の取得条件を指定する場合は、絶対パスあるいは相対パスにて記述します。

  • 絶対パス…ファイルの所在位置を省略せずに記述したもの
  • 相対パス…基準となる地点から見た所在位置を記述したもの

また、パスを指定時に通常の文字列で記述してしまうと、区切り文字(\など)を正しく認識できずエラーになる場合があります。

そのため、指定にはraw文字列を用いて設定を行うのがおすすめです。

r文字列では、文字列の前に「r」あるいは「R」を付ける形で記述します。

raw文字列…文字列内に記述した記号を、そのままの値として認識するための記述法

import glob  # globモジュールを読み込み

# globモジュールのglob関数にて、指定した相対パスを取得
glob.glob(r"Data\test_1.txt")

複数条件の指定方法(正規表現)

glob()関数を用いて複数のパスを取得したい場合は、正規表現にて条件の指定を行います。

正規表現…特定の条件や文字列パターンが紐づられけた記号・文字のこと

glob()関数とあわせて使用する正規表現には、主に以下の種類があります。

スクロールできます
正規表現記述例説明
*C:\Test\Data\*.txt0文字以上の文字列を含む(内容は問わない)
**C:\**\test_1.txt0つ以上の階層(フォルダ)を含む
※引数の設定が必要(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モジュールを使用し、以下の順番でフォルダ名のみの取得を行います。

  1. glob()の結果に対し、dirname()関数でファイル名以前のパスを抽出する
  2. 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モジュールを使用する場面は様々あるので、日頃から使い慣れておくことをおすすめします。

シェアはこちらから
目次