pathlibみんな使っている？


# はじめに

**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')

```

# 終わりに

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

# 参考文献

- [オブジェクト指向のファイルシステムパス](https://docs.python.org/ja/3/library/pathlib.html)

- [Python, pathlibでファイル名・拡張子・親ディレクトリを取得](https://note.nkmk.me/python-pathlib-name-suffix-parent/)