Python3.4でファイルパス操作を行うモジュールとしてpathlibが追加されました。
今までファイルパス操作はos.pathやglobを使っていましたが、pathlibを使うとファイルパスの連続操作がとても書きやすくなるので積極的に使うべきです。
pathlibの特徴
pathlibは次のような特徴があります。
- オブジェクト指向
- ファイルパス操作機能の統合
オブジェクト指向
今まで使っていたos.pathなどでは独立した関数で機能を提供していました。
これに対してpathlibではPathクラスのメソッドやプロパティとして機能が提供されています。
>>> 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では大部分の機能が統合されています。
Path('.').glob('*')
Path('a.txt').open('w')
また、Python3.6以降では今まで使っていたモジュールの一部も引数としてstrだけでなくPathオブジェクトを受け取れるように変更されています。
open(Path('a.txt'), 'w')
pathlibを使うメリット
ここまでの説明で「インスタンスを作成する手間が増えただけでは?」と考える人もいると思います。
しかし、pathlibが真価を発揮するのはパスの連続操作をするときです。
例として、あるファイルが格納されているディレクトリの親ディレクトリにhoge.txt
というファイルが存在するかチェックする処理を比較してみましょう。
まずはos.pathを使った場合です。
>>> os.path.exists(os.path.join(os.path.dirname(os.path.dirname('/a/b/c.txt')), 'hoge.txt'))
False
関数呼び出しが入れ子になっていて、一見して何をやっているのかすぐには理解できません。
次にpathlibを使った場合です。
>>> Path('/a/b/c.txt').parent.parent.joinpath('hoge.txt').exists()
False
>>> (Path('/a/b/c.txt').parents[1] / 'hoge.txt').exists()
False
左から右へ自然と読めるので、とてもわかりやくすなります。
このように**pathlibではパスの連続操作がとても読みやすく(書きやすく)なります。**
pathlibは普及しているのか
自分は実務でpathlibを使ったことはまだありませんし、使われているコードを見たこともありません。
実際のところどの程度使われているのか調べてみました。
Googleトレンド
検索数は増えていますがまだos.pathほどではありません。
GitHub
Codeだと日付検索ができなかったのでIssueで確認します。
年 | os.path | pathlib |
---|---|---|
2014 | 293 | 77 |
2015 | 897 | 181 |
2016 | 826 | 342 |
2017 | 463 | 448 |
※2017/07/23時点の件数 |
着実にpathlibが増えていて、今年はos.pathを抜きそうな勢いです。
Qiita
QiiTrendで確認してみます。
Qiitaの記事ではpathlibはほぼ使われていないと言っていいレベルです。
GitHubとQiitaの結果から考えると、日本だけ普及が遅れているということでしょうか。