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