にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

Python の glob モジュールの使い方

Python3.4 で glob モジュールを使おうとして特殊文字のエスケープ方法が分からず躓いたのでメモ。


ある文字列で始まるファイルをリストアップしたかったので、 glob モジュールを使うことにした。

glob モジュールというのは、

glob モジュールは Unix シェルで使われているルールに従って指定されたパターンにマッチするすべてのパス名を見つけ出します。

http://docs.python.jp/3.4/library/glob.html

というもので、

glob.glob(pathname)

とすると pathname にマッチするファイル名を返す。

pathname は

(/usr/src/Python-1.5/Makefile のように)絶対パスでもいいし、(../../Tools/*/*.gif のように)相対パスでもよくて、シェル形式のワイルドカードを含んでいてもかまいません

http://docs.python.jp/3.4/library/glob.html

とのこと。


ワイルドカードは「*」, 「?」, 「[]」の3種類。

* 任意の文字列(0文字以上)
? 任意の1文字
[…] …で指定された範囲に含まれる任意の1文字
[!…] …で指定された範囲に含まれない任意の1文字

[…] は [a-z] のように範囲で指定したり [abcde] のように文字の羅列で指定したりできる。
詳しくは次を参照。ホームディレクトリを示す ~ 以外は動くとのこと。


そして、問題はワイルドカードに使う特殊文字が含まれるファイルを検索したい場合。これはバックスラッシュでエスケープすることはできず、

文字通りにマッチさせる場合はメタ文字を括弧に入れてください。 例えば、 '[?]' は文字 '?' にマッチします。

http://docs.python.jp/3.4/library/glob.html

とのことで、次の表のようにエスケープするといいらしい。( ] はエスケープしなくてもいい)

マッチさせたい文字 エスケープ後 備考
* [*] Windowsではファイル名に使えない
? [?] Windowsではファイル名に使えない
[ [[]


例えば、(カレントディレクトリで) [2015-11-23] で始まるファイルを探すには

[[]2015-11-23]*

と指定する。


尚、ディレクトリの区切り文字は、Windows環境においては “\” “/” のどちらでも問題なくいけるようだ。しかし、

"C:/Windows/*"

などと指定すると

'C:/Windows\\addins'

みたいな文字列(のリスト)が返ってくる。ドライブレターの後だけスラッシュになる。バックスラッシュを使ったほうがいいのかもしれない。他の関数との兼ね合いは調べてないのでわからない。