14
16

More than 3 years have passed since last update.

pathlibみんな使っている?

Last updated at Posted at 2020-04-27

はじめに

pathlibみなさん使ってますか?まだ使っていないならぜひ一度使って欲しいです。pathlibは何かというとパス操作できるものです。みなさんos.pathとか使うと思いますが、そのos.pathと大体同じことは、pathlibでできます。しかもpathlibはPythonの標準モジュールです。

この記事の対象者

  • pathlibを使ったことのない方
  • pathlib知っているけどまだ作ったことない方
  • pathlibに興味を持ったた方

ぜひ気になった方、チェックしてみてください。

summary

  • ファイル名のみ取得 filename.name
  • 拡張子なしのファイル名取得 filename.stem
  • ファイルの拡張子のみ filename.suffix
  • ファイル読み込み list(dir_path.iterdir()), list(dir_path.glob('*'))
  • ディレクトリ作成(中間ディレクトリも) dir_path.mkdir(parents=True)
  • ディレクトリ作成(存在していてもエラーはかない) dir_path.mkdir(exist_ok=True)
  • 新規ファイル作成 filename.touch()

pathlib

pathlibは、オブジェクト指向のファイルシステムパスです。使い方をみていきましょう。

コンストラクタ

Path()Pathオブジェクトを生成できます

>>> from pathlib import Path
>>> Path()
PosixPath('.')
>>> Path('data')
PosixPath('data')
>>> 
>>> Path('data/image_0001.jpg')
PosixPath('data/image_0001.jpg')
>>> 

ディレクトリかファイルかの判定

is_dir(), is_file()を使います

>>> a = Path('data')
>>> a.is_dir()
True
>>> b = Path('data/image_0001.jpg')
>>> b.is_file()
True
>>> 

存在しないファイルの確認

>>> p = Path('data/img0.jpg')
>>> p.exists()
False

空ファイル作成

.touch()を使います

>>> p = Path('data/img0.jpg')
>>> p.exists()
False
>>> p.touch()
>>> p.exists()
True

ディレクトリ直下のファイル一覧取得

iterdir()glob()を使います

>>> a = Path('data')
>>> list(a.iterdir())
[PosixPath('data/img0.jpg'), 
PosixPath('data/image_0004.jpg'),
PosixPath('data/image_0005.jpg'), 
PosixPath('data/image_0001.jpg'), 
PosixPath('data/image_0002.jpg'), 
PosixPath('data/image_0003.jpg')]
>>> 


>>> list(a.glob('*'))
[PosixPath('data/img0.jpg'), 
PosixPath('data/image_0004.jpg'), 
PosixPath('data/image_0005.jpg'), 
PosixPath('data/image_0001.jpg'), 
PosixPath('data/image_0002.jpg'), 
PosixPath('data/image_0003.jpg')]
>>> 

ファイル名をすべて文字列に変換

strで文字列に変換します

>>> [str(p) for p in a.iterdir()]
['data/img0.jpg', 
'data/image_0004.jpg', 
'data/image_0005.jpg', 
'data/image_0001.jpg', 
'data/image_0002.jpg', 
'data/image_0003.jpg']
>>> 

ファイル名のみ取得(パスの末尾)

name属性を使います

>>> [p.name for p in a.iterdir() if p.is_file()]
['img0.jpg', 
'image_0004.jpg', 
'image_0005.jpg', 
'image_0001.jpg', 
'image_0002.jpg', 
'image_0003.jpg']
>>> 

拡張子なしのファイル名取得

stem属性を使います

>>> [p.stem for p in a.iterdir() if p.is_file()]
['img0', 
'image_0004', 
'image_0005', 
'image_0001', 
'image_0002', 
'image_0003']
>>> 

ファイル名の拡張子を取得

shuffix属性を使います

>>> [p.suffix for p in a.iterdir() if p.is_file()]
['.jpg', '.jpg', '.jpg', '.jpg', '.jpg', '.jpg']
>>> 

ディレクトリの作成

.mkdir()を使います

>>> c = Path('test')
>>> c.exists()
False
>>> c.mkdir()
>>> c.exists()
True
>>> 

中間ディレクトリもまとめて作成

parents=Trueに設定する

>>> Path('test/data/001').mkdir(parents=True)

ディレクトリが存在していてもエラーが出ないように

exist_ok=Trueを設定する

>>> Path('test/data').mkdir(exist_ok=True)

パスのつなげ方

Pathオブジェクトに対して /で連結する
os.path.join()と同じことを/でできます

>>> d = Path('data')
>>> d / 'train' / '001'
PosixPath('data/train/001')

親ディレクトリの取得

parentを使います

>>> b
PosixPath('data/image_0001.jpg')
>>> b.parent
PosixPath('data')

終わりに

今回はよく使うものを忘れないようにするために自分の備忘録として書きました。少しでも参考になればと思います。

参考文献

14
16
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
14
16