Skip to content

glob#

基本的な使い方#

from glob import glob

log = glob("path/sub-dir/")
# 戻り値はリスト型
# 見つからない場合は空のリスト

使用できる特殊文字#

以下の特殊文字を使用して複数パターンの文字列マッチでパス取得可能。

  • 長さ0文字以上の任意の文字列にマッチ: *
    • 例: glob("path/*.log")
  • 任意の一文字にマッチ: ?
    • 例: glob("path/???.log")
  • 括弧の中の文字列から一文字にマッチ: []
    • 例: glob("path/Router_[0-9].log")

Tip

特殊文字のエスケープは[]で囲む。
例 : glob("path/[*].log")

もしくは glob.escape() でも可能です 例 : `glob.escape("path/**.log")

再帰的に取得#

バージョン 3.5 で変更: "**" を使った再帰的な glob がサポートされました。

path の指定に**使用し、また引数にrecursive=True使うと、あらゆるファイルや0個以上のディレクトリ およびサブディレクトリにマッチ

**を使うとあらゆる中間ディレクトリに対応してマッチさせることが可能。

glob('path/**/*.log', recursive=True))

特定のディレクトリに含まれるすべてのファイル、ディレクトリの一覧を取得したい場合は以下のように記述。

glob('path/**', recursive=True))

reモジュール併用#

glob 自体で使える正規表現は少ないため、glob()**と引数recursive=Trueを使ってすべてのファイル、 ディレクトリを再帰的に集め、if 文re`モジュールで抽出する方法で補う。

import re
from glob import glob
# リスト内包表記も併用
[x for x in glob('temp/**', recursive=True) if re.search('Router\d+\.log', x)])

ディレクトリ・ファイル名のみ#

ディレクトリ名のみ取得したい場合は、**の末尾にディレクトリの区切り文字をつける。

glob('path/**/', recursive=True))

ファイル名のみを取得したい場合は、os.path.isfile()でファイルかどうかを判定。

# リスト内包表記も併用
print([x for x in glob('path/**', recursive=True) if os.path.isfile(x)])

Tip

OS に依存しない区切り文字は os.sep にて記述

例:(glob(os.path.join('path', '**' + os.sep + 'test.log', recursive=True)))

イテレータで一覧を取得: iglob()#

globf.iglob() を使用するとイテレーターをかえします。recursive=True も指定可能です。