🙆
python の glob.glob はドットファイルを処理しないので強制的に処理させるようにしてみる
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']
Discussion