Python
pathlib

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 との組み合わせで、より複雑な抽出が可能になります、詳しくは以下。

参考