=== 目次 ===
globで鉤括弧を含むファイルパスで動作しない例
例えば、以下のようなフォルダとファイルが存在しているとします。C:\
└ [new]test
├ file1.txt
├ file2.txt
└ file3.txt
このファイル構造に対して、以下のようにそのままglobでファイルリストを取得してみましょう。
import glob
Path = "C:\\[new]test\*.*"
FileList = glob.glob(Path)
print(FileList) # Result: []
すると、コメントアウト文に記載したように本来欲しいファイルのリストではなく空(None)が出力されてしまいます。
原因
原因はglobの引数のファイルパスに鉤括弧を使用しているためです。globは正規表現に対応していますが、正規表現において鉤括弧は「どれかの文字に該当する」という意味になります。
よって、上記のサンプルコードの場合には「”n”, “e”, “w”のどれがに該当する1文字」と解釈されてしまって、うまく検索ができなくなります。
対処方法
このようなことを回避するためにglobには鉤括弧のように正規表現の記法になっている文字をエスケープ処理する関数であるglob.escapeが実装されています。以下、glob.escapeを使用したサンプルコードです。
import glob
Path = "C:\\" + glob.escape("[new]") + "test\*.*"
print(Path)
FileList = glob.glob(Path)
print(FileList) # Result: ['C:\\test\\file1.txt', 'C:\\test\\file2.txt', 'C:\\test\\file3.txt']
注意点としては「」などもエスケープ対象なので鉤括弧の文字列のみをエスケープ処理しましょう。「」がエスケープ処理されてしまうと、ワイルドカードではなく、「*」という文字列そのものにマッチするようになってしまいます。