1. pathlibとは
ファイルやディレクトリを操作するpython標準パッケージです
https://docs.python.org/ja/3/library/pathlib.html
2. os.pathよりも優れている点
2-1. 連続して操作するときに可読性が上がる
os.pathだと入れ子になって読みにくいですが、pathlibだと読みやすいです
os.pathの場合
>>> path = '../hoge/fuga/hoo/sample.png'
>>> os.path.dirname(os.path.dirname(os.path.dirname(path)))
'../hoge'
pathlibの場合
>>> p = Path('../hoge/fuga/hoo/')
>>> p.parent.parent.as_posix()
'../hoge'
2-2. 末尾の / の有無を意識しなくても良い
os.path.dirname(path)は '/'.join(path.split('/')[:-1]) をやってるだけなので末尾に'/'があるかないかで結果が変わりますが、pathlibはオブジェクト化するときに解釈して末尾の'/'を無視してくれるので意識する必要がなくなります
os.pathの場合
>>> path = '../hoge/fuga/hoo/'
>>> os.path.dirname(os.path.dirname(os.path.dirname(path)))
'../hoge'
>>> path = '../hoge/fuga/hoo'
>>> os.path.dirname(os.path.dirname(os.path.dirname(path)))
'../'
pathlibの場合
>>> p = Path('../hoge/fuga/hoo/')
>>> p.parent.parent.parent
'../'
>>> p = Path('../hoge/fuga/hoo')
>>> p.parent.parent.parent
'../'
2-3. 拡張子やファイル名の置き換えが簡単
拡張子の置き換え
>>> file = Path('../code/hoge.py')
>>> file.with_suffix('.txt').as_posix()
'../code/hoge.txt'
ファイル名の置き換え
>>> file = Path('../code/hoge.py')
>>> file.with_name('fuga.py').as_posix()
'../code/fuga.py'
2-4. ワイルドカード検索が出来る
拡張子やファイル名でファイルまたはフォルダを検索することが出来ます
>>> list(p.rglob('*.py'))
[WindowsPath('../code/fuga.py'),
WindowsPath('../code/hoba.py'),
WindowsPath('../code/hoge.py'),
WindowsPath('../code2/fugafuga.py'),
WindowsPath('../code2/hogehoge.py')]
3. 使い方
pathの指定
pathを指定する
>>> from pathlib import Path
>>> p = Path('..')
>>> p
WindowsPath('..')
ファイル一覧を取得する
>>> list(p.iterdir())
[WindowsPath('../code'),
WindowsPath('../code2'),
WindowsPath('../data'),
WindowsPath('../input')]
pathを移動する
フォルダに移動する
>>> q = p / 'code'
>>> q
WindowsPath('../code')
親フォルダに移動する
>>> q = q.parent
>>> q
WindowsPath('..')
pathを文字列で取得する
posix形式
>>> q = p / 'code'
>>> q.as_posix()
'../code'
絶対path
>>> q.resolve()
WindowsPath('C:/Users/jjaka/google_drive/python/python練習/20210224_pathlib')
ファイル名、拡張子を取得する
>>> q = Path('../code/foo.tar.gz')
>>> q
WindowsPath('../code/foo.tar.gz')
>>> q.name
'foo.tar.gz'
>>> q.suffix
gz
>>> q.suffixes
['.tar', '.gz']
ファイル名、拡張子を置き換える
>>> q = Path('../code/hoge.py')
>>> q.with_suffix('.txt')
WindowsPath('../code/hoge.txt')
>>> q.with_name('fuga.txt')
WindowsPath('../code/fuga.txt')
pathにファイル、ディレクトリがあるか確認する
>>> q = Path('../code/hoge.py')
>>> q.is_file()
True
>>> q = Path('../code')
>>> q.is_dir()
True
>>> q.is_reserved()
False
ワイルドカードで検索する
rglobはフォルダ以下をすべて検索してくれます
>>> p = Path('..')
>>> list(p.rglob('*.py'))
[WindowsPath('../code/fuga.py'),
WindowsPath('../code/hoba.py'),
WindowsPath('../code/hoge.py'),
WindowsPath('../code2/fugafuga.py'),
WindowsPath('../code2/hogehoge.py')]
>>> q = q / 'code'
>>> list(q.rglob('*.py'))
[WindowsPath('../code/fuga.py'),
WindowsPath('../code/hoba.py'),
WindowsPath('../code/hoge.py')]