globで鉤括弧を含むファイルパスで動作しない原因と対処方法 | Python

※当サイトはアフィリエイト広告を利用しています。

この記事ではPythonにおいてglobで鉤括弧を含むファイルパスでうまく動作しない原因とその対処方法を紹介します。
スポンサーリンク


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']
注意点としては「」などもエスケープ対象なので鉤括弧の文字列のみをエスケープ処理しましょう。

」がエスケープ処理されてしまうと、ワイルドカードではなく、「*」という文字列そのものにマッチするようになってしまいます。

まとめ

この記事ではPythonにおいてglobで鉤括弧を含むファイルパスでうまく動作しない原因とその対処方法を紹介しました。