Edited at

pathlib.Path.globで不要なファイルを除外する方法


TL;DR

Too Longでも無いけどざっくり3行



  • pathlib.Path().glob() でワイルドカード(*)を使い、かつ対象を絞りたい場合のやり方


  • pathlib.Path().glob(*[!hoge]) のように [!xxx] を用いれば良い

  • 元ネタは Stack Overflow


検証環境

MacBookPro

$ sw_vers

ProductName: Mac OS X
ProductVersion: 10.14
BuildVersion: 18A391

$ pyenv --version
pyenv 1.1.5

$ python --version
Python 3.6.2 :: Anaconda, Inc.


やり方

[!] を用いる

>>> import pathlib

# そのままだと hoge.txt, hoge.txt.bak が引っ掛かる
>>> list(pathlib.Path().glob("hoge*"))
[PosixPath('hoge.txt'), PosixPath('hoge.txt.bak')]

# .bak を除外したい場合は [!bak] を指定
>>> list(pathlib.Path().glob("hoge*[!bak]"))
[PosixPath('hoge.txt')]


何が行われているのか?

実装をちゃんと見ていないので詳しくはわかりませんが、「正規表現っぽい何か」が適用されるようです。ドキュメントには詳細が書かれてなかった。

(間違っていればマサカリコメントお願いします)

# あらかじめ touch で hoge.txt.1,2,3 を生成

>>> list(pathlib.Path().glob("hoge.txt*"))
[PosixPath('hoge.txt.1'), PosixPath('hoge.txt'), PosixPath('hoge.txt.bak'), PosixPath('hoge.txt.2'), PosixPath('hoge.txt.3')]

# 数値やアルファベットの範囲指定もできる
>>> list(pathlib.Path().glob("hoge.txt.[1-3]"))
[PosixPath('hoge.txt.1'), PosixPath('hoge.txt.2'), PosixPath('hoge.txt.3')]
>>> list(pathlib.Path().glob("hoge.txt.ba[a-z]"))
[PosixPath('hoge.txt.bak')]

詳しく知りたい方は実装を追ってみてください。


もっとちゃんと検索したい

re.serch との組み合わせで、より複雑な抽出が可能になります、詳しくは以下。


参考