LoginSignup
18
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-06

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

参考

18
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
16