Pythonのpathlibの今時な使い方

183, 2021-02-15

目次

Pythonのpathlibの使い方

プログラミング言語のPythonにはpathlibというモジュールがあります。
pathlibはWindowsやUNIX系のシステムのパスを抽象化して管理することが出来ます。

わずらわしいパス関連の処理をとてもイージーに記述することが出来ます。

この記事では今時なpathlibの使い方をわかりやすく解説します。
具体的には↓を見ていきます。

  • 前提とするディレクトリ構成

  • Pathの使い方

前提とするディレクトリ構成

今回解説するpathlibはパスを扱いますが、パスのサンプルとして↓のようなディレクトリ構成を用意します。

sample/
├── sub1
│   ├── file1.txt
│   └── file2.txt
└── sub2
    ├── file3.txt
    └── file4.txt

2 directories, 4 files

きれいなディレクトリだろ

サンプルなんだぜ、これ

Pathの使い方

pathlibの中に入っているPathというクラスを使うとパスを操作することが出来ます。
基本的にはこのPathにパスを渡してPathのメソッドを使用することでパスを操作します。
Pathは純粋パスクラス(PurePath)のサブクラスです。

Pathの初期化

Pathを初期化するには↓のようにします。

from pathlib import Path

p = Path('./sample')
print(type(p))

Windows環境で↑のコードを実行すると↓のように出力されます。

<class 'pathlib.WindowsPath'>

Windows環境では↑のようにWindowsPathが生成されます。
いっぽうUNIX環境ではPosixPathが生成されます。

サブディレクトリの探索

Pathに渡したパスのサブディレクトリの一覧を取得するには↓のようにiterdir()を使います。

from pathlib import Path

p = Path('./sample')

for path in p.iterdir():
    print(path)
    print(type(path))

↑のコードを実行すると↓のような結果になります。

sample/sub1
<class 'pathlib.PosixPath'>
sample/sub2
<class 'pathlib.PosixPath'>

↑のようにiterdir()でサブディレクトリのパスを取得したら、あとはルートのパスと同じようにメソッドを使ってパスに対する操作を行えるということになります。

特定ファイルをまとめて取得

パスのメソッドglob()を使うと、特定のディレクトリにある特定の拡張子のファイルをまとめて取得することが出来ます。
たとえば↓のようにです。

from pathlib import Path

p = Path('./sample')
paths = p.glob('sub1/*.txt')

for path in paths:
    print(path)

↑のコードを実行すると↓のような結果になります。

sample/sub1/file1.txt
sample/sub1/file2.txt

ディレクトリ間の移動

/でパスを演算するとディレクトリ間を移動することが出来ます。

from pathlib import Path

p = Path('./sample')
print(p)

q = p / 'sub2'
print(q)

↑のコードを実行すると↓のような結果になります。

sample
sample/sub2

注意したいのは↑の記法では存在しないディレクトリにも移動できるという点です。
たとえば↓のコードはエラーになりません。

from pathlib import Path

p = Path('./sample')
print(p)

q = p / 'nothing'
print(q)

絶対パスを得る

パスのメソッドresolve()を使うと絶対パスを得ることが出来ます。

/path/to/dir/sample

パスが存在するか確認する

パスのメソッドexists()を使うと、そのパスが存在するかどうか確認することが出来ます。

from pathlib import Path

p = Path('./sample')
print(p.exists())

q = p / 'nothing'
print(q.exists())

↑のコードは↓のような結果になります。

True
False

パスがディレクトリかどうか確認する

パスのメソッドis_dir()を使うと、そのパスがディレクトリかどうか確認することが出来ます。

from pathlib import Path

p = Path('./sample')
print(p.is_dir())

q = p / 'sub1' / 'file1.txt'
print(q.is_dir())

↑のコードを実行すると↓のような結果になります。

True
False

ファイルかどうか確認するにはis_file()を使います。

現在のディレクトリを取得する

パスのクラスメソッドcwd()を使うと現在のパスを取得できます。

from pathlib import Path

print(Path.cwd())

↑のコードを実行すると↓のような結果になります。

/path/to/dir/

ホームディレクトリを取得する

パスのクラスメソッドhome()を使うとホームディレクトリを取得できます。

from pathlib import Path

print(Path.home())

↑のコードを実行すると↓のような結果になります。

/home/myuser

ファイルのサイズを取得する

ファイルのサイズを取得するにはパスのメソッドstat()を使い、st_sizeを参照します。

from pathlib import Path

p = Path('sample/sub1/file1.txt')
print(p.stat().st_size)

↑のコードを実行すると↓のような結果になります。

128

その他のメソッド

この他にもPathにはいろいろなメソッドがあります。
他のメソッドについては↓を参照してください。

おわりに

今回はpathlibの使い方を見て見ました。
pathlibはパスを抽象化して扱いやすくしてくれます。
ファイルシステム関連のプログラムを作りたい時に重宝しそうなライブラリですね。

ファイルシステムを制する者はプログラムを制する

先生、デフラグがしたいです