pathlibモジュールのパス操作メソッド【Python tips】

Python

Pythonエンジニア育成推進協会監修 Python 3スキルアップ教科書 [ 辻 真吾、小林 秀幸、鈴木 庸氏、細川 康博 ]

 

こんにちは、monachan_papa です。

今回は Pythonの標準モジュールである pathlibモジュールについて解説します。
Pathlibモジュールは、ファイルやディレクトリを Pathオブジェクトとして扱うためのモジュールです。パス操作・ファイル操作系のモジュールは他にも osモジュールがありますが、格段にシンプル且つオブジェクト指向的に操作できるのが、Pathlibモジュールです。

本解説を読むことにより、Pathlibモジュールを使ったパス操作・ファイル操作の基本が理解できるようになります。
さっそく、Pathlibモジュールをインポートしてガンガン基本マスターしていきましょう。

import pathlib

Pathオブジェクトの基本

Pathオブジェクトの生成

pathlib.Path() で、Pathオブジェクトが生成できます。

pathlib.Path(パスを指定)

以下のコードは、カレントディレクトリの Pathオブジェクトを生成しています。引数には、相対パスまたは絶対パスを指定します。

pathlib.Path('.')
PosixPath('.')

引数を指定しない場合は、カレントディレクトリ(‘.’) を指定したとみなされます。

pathlib.Path()
PosixPath('.')

 

UNIX系OS の場合は、PosixPath(‘.’) になります。
Windows の場合は、WindowsPath(‘.’) になります。

 

以下のコードは、カレントディレクトリにある hoge.txt のPathオブジェクトを生成した場合です。

pathlib.Path('hoge.txt')
PosixPath('hoge.txt')

型の意識、osモジュールとの違い

一番はじめに、osモジュールとは格段に違うと書きました。何が違うのか、まずは以下のコードを見てください。
両者のカレントディレクトリ取得においての検証です。

# pathlibモジュールの場合
import pathlib
print(type(pathlib.Path()))

# osモジュールの場合
import os
print(type(os.getcwd()))
<class 'pathlib.PosixPath'>
<class 'str'>

型があきらかに違います。 osモジュールは、単なる文字列型ですね。
よって、Pathlibモジュールを扱う際は、この型の違いを意識するようにしてください。

 


Pythonエンジニア育成推進協会監修 Python 3スキルアップ教科書 [ 辻 真吾、小林 秀幸、鈴木 庸氏、細川 康博 ]

Pathオブジェクトの操作

これから、Pathオブジェクトを操作するメソッドなどをいくつかピックアップして紹介します。
シンプルで操作性も爽快なので、是非すべてマスターしてください。

絶対パスへの変換(resolve)

resolveメソッドを使うと、相対パスのオブジェクトを絶対パスのPathオブジェクトに変換できます。

Pathオブジェクト.resolve()
p = pathlib.Path('hoge.txt')
p.resolve()
PosixPath('/Users/yj/blog/hoge.txt')

文字列への変換(str)

便利な Pathオブジェクトですが、文字列に変換しなければならないシーンがあるかもしれません。
そんなときは、str() でサクッと文字列変換します。

str(Pathオブジェクト)

以下のコードは、hoge.txt の絶対パスを文字列変換したものです。

str(pathlib.Path('hoge.txt').resolve())
'/Users/yj/blog/hoge.txt'

ディレクトリ/ファイルの存在確認(exists)

existsメソッドを使うと、確認したいディレクトリまたはファイルの存在確認ができます。
存在すれば True、存在しなければ False を返します。

Pathオブジェクト.exists()
p = pathlib.Path('hoge.txt')
p.exists()
True

ディレクトリ判定(is_dir)

is_dirメソッドを使うと、確認対象がディレクトリかどうか判定できます。
ディレクトリなら True、ディレクトリでないなら False を返します。

Pathオブジェクト.is_dir()
p = pathlib.Path('hoge.txt')
p.is_dir()
False

ファイル判定(is_file)

is_fileメソッドを使うと、確認対象がファイルかどうか判定できます。
ファイルなら True、ファイルでないなら False を返します。

Pathオブジェクト.is_file()
p = pathlib.Path('hoge.txt')
p.is_file()
True

ディレクトリ/ファイル一覧の取得(iterdir)

iterdirメソッドを使うと、ディレクトリ配下のディレクトリ/ファイル一覧を取得することができます。

Pathオブジェクト.iterdir()

以下のコードは、カレントディレクトリ配下にある「テストディレクトリ」内の一覧です。

p = pathlib.Path('./テスト')
p.iterdir()
<generator object Path.iterdir at 0x7fed3868dba0>

ご覧のように、ジェネレータが返ってきます。
中身を見るために、list関数でリスト化するか、for文で print出力する等の対応をします。

list(p.iterdir())
[PosixPath('テスト/Untitled Folder'),
 PosixPath('テスト/Untitled.ipynb'),
 PosixPath('テスト/untitled.md'),
 PosixPath('テスト/hoge.txt'),
 PosixPath('テスト/untitled.txt'),
 PosixPath('テスト/untitled1.txt'),
 PosixPath('テスト/.ipynb_checkpoints')]
for name in p.iterdir():
    print(name)
テスト/Untitled Folder
テスト/Untitled.ipynb
テスト/untitled.md
テスト/hoge.txt
テスト/untitled.txt
テスト/untitled1.txt
テスト/.ipynb_checkpoints

指定ファイルの取得(glob)

globメソッドを使うと、拡張子が「.txt」だけのような指定ファイルを取り出すことができます。
このメソッドもジェネレータを返すので、適切に対応します。

Pathオブジェクト.golb(パターン文字列)
p = pathlib.Path('./テスト')
p.glob('*.txt')
<generator object Path.glob at 0x7fed1802a2e0>
list(p.glob('*.txt'))
[PosixPath('テスト/hoge.txt'),
 PosixPath('テスト/untitled.txt'),
 PosixPath('テスト/untitled1.txt')]

パス連結(joinpath)

joinpathメソッドを使うと、パスを連結することができます。
引数には、複数のパスを指定することが可能です。

Pathオブジェクト.joinpath(パス1, パス2, パス3, …)
p = pathlib.Path()
p.joinpath('AAA', 'BBB', 'CCC', 'python.txt')
PosixPath('AAA/BBB/CCC/python.txt')

パス連結(演算子’/’の利用)

演算子’/’ を使って、パスを連結することも可能です。

Pathオブジェクト / パス1 / パス2 / パス3 / …
p = pathlib.Path()
p / 'AAA' / 'BBB' / 'CCC' / 'python.txt'
PosixPath('AAA/BBB/CCC/python.txt')

親ディレクトリの取得(‘..’の利用)

さきほど紹介した joinpathメソッドの引数に ‘..’ を指定すると、親ディレクトリのパスを取得することができます。

Pathオブジェクト.joinpath(‘..’)
p = pathlib.Path()
p.joinpath('..')
PosixPath('..')

しかし、ご覧のように相対パスになっています。
シーンに応じて、絶対パスが必要な場合があります。その際は、resolveメソッドとの連携をします。

p = pathlib.Path()
p.joinpath('..').resolve()
PosixPath('/Users/yj')

以上で、pathlibモジュールの解説を終わります。
読んでいて気づかれたと思われますが、すべての起点はPathオブジェクトを生成するpathlib.Path() です。
これをもとにエレガントなメソッドが広がっていきます。

pathlibモジュールは、Python3.4 から導入された比較的新しいモジュールなので参考書などを見てみると、osモジュールに比べると登場シーンが少ないです。しかし、シンプルで非常に便利なので積極的に使っていきましょう。

とはいえ、osモジュールを使った方が良いシーンもあるので、そのときはosモジュールを使うべきです。
以上より、臨機応変にpathlibモジュールとosモジュールの両刀使いになりましょう。

pathlibモジュールとosモジュールをさらに学習するには、Pythonエンジニア育成推進協会監修 Python 3スキルアップ教科書 [ 辻 真吾、小林 秀幸、鈴木 庸氏、細川 康博 ]がたいへんにオススメです。
どちらのモジュールもきっちり専用の章が設けられており、一挙に体系的に学ぶことができるすばらしい本です。

 


Pythonエンジニア育成推進協会監修 Python 3スキルアップ教科書 [ 辻 真吾、小林 秀幸、鈴木 庸氏、細川 康博 ]

 

また、爆速で pathlibなどの標準モジュール を学びたい御方にはプログラミングスクールを考えるのも、ひとつの手です。独学よりも効果が出やすいですが、いかんせん投資がけっこうかかります。しかし、techgymというスクールは通うか通わないかは別として、無料のサンプルテキスト&解説動画がもらえます。これをとりあえず getしてまずは試しに体験学習するのもありでしょう。

コメント

タイトルとURLをコピーしました