LoginSignup
53
46

More than 3 years have passed since last update.

python pathlibの使い方メモ

Last updated at Posted at 2021-02-25

1. pathlibとは

ファイルやディレクトリを操作するpython標準パッケージです
https://docs.python.org/ja/3/library/pathlib.html

os.pathで出来ることは大抵できます

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')]
53
46
0

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
53
46