Python3.4以降ならos.pathはさっさと捨ててpathlibを使うべき

[pathlib]:https://docs.python.jp/3/library/pathlib.html
[os.path]:https://docs.python.jp/3/library/os.path.html
[os]:https://docs.python.jp/3/library/os.html
[glob]:https://docs.python.jp/3/library/glob.html
[Path]:https://docs.python.jp/3/library/pathlib.html#pathlib.Path
[open]:https://docs.python.jp/3/library/functions.html#open
[qiitrend]:https://qiitrend.herokuapp.com/


Python3.4でファイルパス操作を行うモジュールとして[pathlib]が追加されました。

今までファイルパス操作は[os.path]や[glob]を使っていましたが、[pathlib]を使うとファイルパスの連続操作がとても書きやすくなるので積極的に使うべきです。

# pathlibの特徴

[pathlib]は次のような特徴があります。

- オブジェクト指向
- ファイルパス操作機能の統合

## オブジェクト指向

今まで使っていた[os.path]などでは独立した関数で機能を提供していました。

これに対して[pathlib]ではPathクラスのメソッドやプロパティとして機能が提供されています。

```pycon:pathlib
>>> from pathlib import Path
>>> Path('/a/b/c.txt').parent
PosixPath('/a/b')
>>> Path('/a/b/c.txt').parents[1]
PosixPath('/a')
>>> Path('/a/b').joinpath('c/d')
PosixPath('/a/b/c/d')
>>> Path('/a/b') / 'c/d'
PosixPath('/a/b/c/d')
```
戻り値もstrではなく[Path]オブジェクトになっています。

## ファイルパス操作機能の統合

今までは[os.path]だけでなく[os]、[glob]や組み込み関数の[open]など複数のモジュールにファイル・パス操作の機能が分散していましたが、[pathlib]では大部分の機能が統合されています。

```py3:pathlibのglob
Path('.').glob('*')
```
```py3:pathlibのopen
Path('a.txt').open('w')
```

また、Python3.6以降では今まで使っていたモジュールの一部も引数としてstrだけでなく[Path]オブジェクトを受け取れるように変更されています。

```pycon:組み込み関数のopen()にPathオブジェクトを渡す
open(Path('a.txt'), 'w')
```

# pathlibを使うメリット

ここまでの説明で「インスタンスを作成する手間が増えただけでは？」と考える人もいると思います。

しかし、**[pathlib]が真価を発揮するのはパスの連続操作をするときです。**

例として、あるファイルが格納されているディレクトリの親ディレクトリに`hoge.txt`というファイルが存在するかチェックする処理を比較してみましょう。

まずは[os.path]を使った場合です。

```pycon:os.path
>>> os.path.exists(os.path.join(os.path.dirname(os.path.dirname('/a/b/c.txt')), 'hoge.txt'))
False
```

関数呼び出しが入れ子になっていて、一見して何をやっているのかすぐには理解できません。

次に[pathlib]を使った場合です。

```pycon:pathlibその１
>>> Path('/a/b/c.txt').parent.parent.joinpath('hoge.txt').exists()
False
```
```pycon:pathlibその２
>>> (Path('/a/b/c.txt').parents[1] / 'hoge.txt').exists()
False
```

左から右へ自然と読めるので、とてもわかりやくすなります。

このように**[pathlib]ではパスの連続操作がとても読みやすく(書きやすく)なります。**

# pathlibは普及しているのか

自分は実務でpathlibを使ったことはまだありませんし、使われているコードを見たこともありません。

実際のところどの程度使われているのか調べてみました。

## Googleトレンド

https://trends.google.co.jp/trends/explore?date=today%205-y&q=python%20os.path,python%20pathlib

<img width="300" alt="python_os_path__python_pathlib_-_調べる_-_Google_トレンド.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/41d918aa-704d-3287-3764-60948d16216e.png">

検索数は増えていますがまだos.pathほどではありません。

## GitHub

Codeだと日付検索ができなかったのでIssueで確認します。

|年|os.path|pathlib|
|---|---:|---:|
|2014|[293](https://github.com/search?utf8=%E2%9C%93&q=created%3A2014+language%3APython+os.path&type=Issues)|[77](https://github.com/search?utf8=%E2%9C%93&q=created%3A2014+language%3APython+pathlib&type=Issues)|
|2015|[897](https://github.com/search?utf8=%E2%9C%93&q=created%3A2015+language%3APython+os.path&type=Issues)|[181](https://github.com/search?utf8=%E2%9C%93&q=created%3A2015+language%3APython+pathlib&type=Issues)|
|2016|[826](https://github.com/search?utf8=%E2%9C%93&q=created%3A2016+language%3APython+os.path&type=Issues)|[342](https://github.com/search?utf8=%E2%9C%93&q=created%3A2016+language%3APython+pathlib&type=Issues)|
|2017|[463](https://github.com/search?utf8=%E2%9C%93&q=created%3A2017+language%3APython+os.path&type=Issues)|[448](https://github.com/search?utf8=%E2%9C%93&q=created%3A2017+language%3APython+pathlib&type=Issues)|
※2017/07/23時点の件数

着実にpathlibが増えていて、今年はos.pathを抜きそうな勢いです。

## Qiita

[QiiTrend]で確認してみます。

https://qiitrend.herokuapp.com/trend?mode=count&period=4&query=tag%3Apython+os.path&query=tag%3Apython+pathlib&unit=yearly

<img width="300" alt="QiiTrend.png" src="https://qiita-image-store.s3.amazonaws.com/0/35192/04a2bd0d-6df0-bb4a-401f-e7e559bff12d.png">

Qiitaの記事ではpathlibはほぼ使われていないと言っていいレベルです。

GitHubとQiitaの結果から考えると、日本だけ普及が遅れているということでしょうか。