🙆

python の glob.glob はドットファイルを処理しないので強制的に処理させるようにしてみる

2021/06/16に公開

glob.glob とは

os.walk のようにファイル名やディレクトリ名を 1 つずつ yield するメソッドです。注意点があってドットファイルを処理してくれません。os.walk も glob.glob も「ファイル名やディレクトリ名を yield する」という機能だけど、同じ機能を持つメソッドを複数実装する意味については知りません。

glob --- Unix 形式のパス名のパターン展開 — Python 3.9.4 ドキュメント

glob はドット (.) で始まるファイル名は特別扱いする点に注意してください。

環境

python 3.9.5

実装

glob.glob のソースコードを見ると _ishidden() というメソッドによりドットファイルを判定しているようです。

_ishidden https://github.com/python/cpython/blob/main/Lib/glob.py#L210

たとえば _ishidden を呼び出す _glob1 https://github.com/python/cpython/blob/main/Lib/glob.py#L92

強制的に処理させるようにしてみる

ファイルを用意します。

% ls -a1
.
..
.hoge.txt
hoge.txt
hogehoge.txt
source.txt

_ishidden を上書きします。

import glob

def hoge0():
    print("hoge0")
    print(glob.glob("*.txt"))

def hoge1():
    print("hoge1")
    old_ishidden = glob._ishidden
    glob._ishidden = lambda x: False
    print(glob.glob("*.txt"))
    glob._ishidden = old_ishidden


hoge0()
hoge1()

実行します。

hoge0 は通常の glob.glob なのでドットファイルを処理しません。

hoge1 は強制的にドットファイルを処理させてます。

% python3 glog0.py
hoge0
['ccgjju.txt', 'source.txt', 'hogehoge.txt', 'hoge.txt']
hoge1
['ccgjju.txt', 'source.txt', '.hoge.txt', 'hogehoge.txt', 'hoge.txt']

参考

A glob.iglob that include dot files and hidden files

Discussion