Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

pathlibの特徴

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

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

オブジェクト指向

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

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

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だけでなくosglobや組み込み関数のopenなど複数のモジュールにファイル・パス操作の機能が分散していましたが、pathlibでは大部分の機能が統合されています。

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

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

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

pathlibを使うメリット

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

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

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

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

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

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

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

pathlibその1
>>> Path('/a/b/c.txt').parent.parent.joinpath('hoge.txt').exists()
False
pathlibその2
>>> (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

python_os_path__python_pathlib_-_調べる_-_Google_トレンド.png

検索数は増えていますがまだ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で確認してみます。

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

QiiTrend.png

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

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

tag1216
Qiita戦闘力はキュイレベルです! /作ったもの ◆QiiTrend:https://qiitrend.herokuapp.com/ ◆Qiiner:https://qiiner.tag1216.net/ ◆Qiitaでいいねしたら草生えるページ:https://qiiner.tag1216.net/likes-heatmap
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした