Pythonのpathlibライブラリの使い方ガイド

ながみえ

Pythonでファイルやディレクトリを操作したいとき、多くの人がまず osモジュールos.path を使うかもしれません。

しかし、Python 3.4から標準ライブラリに加わった「pathlib」を使えば、パス操作やファイル操作がより直感的かつシンプルに書けるようになります。

pathlibはオブジェクト指向的なインターフェースを提供し、「/」演算子でパスを結合したり、ファイルやディレクトリの存在確認、一覧取得、読み書きなども簡単に実装できます。

この記事ではPython初心者から中級者までを対象に、pathlibの基本から応用までを、実用的なコード例とともに分かりやすく解説します。

「ファイル操作」や「ファイル一覧」「ファイル読み書き」をもっとスッキリ書きたい!
そんな方は、ぜひこのガイドを参考にしてください。

もくじ

Pythonの標準ライブラリ「pathlib」とは?初心者向け概要と特徴

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

pathlibの基本概要とPythonでの役割

pathlibは、ファイルやディレクトリのパス操作をオブジェクト指向的に行えるPythonの標準ライブラリです。

従来のos.pathに比べて、パス操作がより直感的に書けるのが特徴です。

# pathlibを使ったパス結合の例
from pathlib import Path # pathlibのPathクラスをインポート

p = Path('data') / 'sample.txt' # dataというディレクトリ名でPathオブジェクトを生成し、sample.txtと結合
print(p)  # data/sample.txt

※「/」演算子でパスが自然につながります。

pathlibとos.pathとの違い

  • オブジェクト指向的に書ける:パスを「Pathオブジェクト」として扱い、属性やメソッドで操作できる
  • 可読性・保守性が高い:パス操作が簡潔で分かりやすく、エラーも減る
  • Windows・UNIXなど複数OSのパスに対応:パス区切り文字(\や/)も自動で扱ってくれる

もっと詳細な比較は このページの下部 に記載してあります。

pathlibを学ぶべき理由・メリット

  • ファイル操作やディレクトリ操作をもっと直感的にしたい
  • Pythonらしい、モダンな書き方を身につけたい
  • 「ファイル一覧」や「ファイル読み書き」など実践的なコードをシンプルに書きたい

このようなニーズを持つ方は、pathlibを学ぶことで作業効率が格段に向上します。

Python pathlibの使い方【インポート〜基本操作の実例】

pathlibインポート方法と利用準備

まずはpathlibをインポートします。Python 3.4以降では標準ライブラリなので、追加インストールは不要です。

from pathlib import Path # pathlibのPathクラスをインポート

pathlibには他のクラスもありますが、通常はPathだけで十分です。

Pathオブジェクトを作成する方法(相対パス・絶対パス)

Pathクラスのインスタンスを生成することで、パス操作ができるようになります。

相対パスを生成する方法

# カレントディレクトリ(現在開いているフォルダ)からの相対パスを生成する場合
p = Path('data/sample.txt') # パスオブジェクトを作成
print(p)  # data/sample.txt

絶対パスを生成する方法

# 絶対パスを指定する場合
p = Path('/home/user/data/sample.txt')
print(p)  # /home/user/data/sample.txt

.cwd()メソッドと.home()メソッド|カレントディレクトリやユーザーディレクトリの利用

# カレントディレクトリ
current_dir = Path.cwd() # プログラムを実行している「今いるディレクトリ」の絶対パスを取得

# ユーザーディレクトリ
home_dir = Path.home()  # ユーザーのホームディレクトリの絶対パスを取得
						# Linux/Macなら「/home/ユーザー名」
						# Windowsなら「C:\Users\ユーザー名」

pathlibでよく使う基本メソッドまとめ

Pathオブジェクトにはファイル・ディレクトリの存在確認や種別判定など、よく使うメソッドが用意されています。

.exists()メソッド:ファイルやディレクトリの存在を確認

p = Path('data/sample.txt') # パスオブジェクトを作成
if p.exists(): # もしそのパスのファイルかフォルダが存在するなら
    print('ファイルまたはディレクトリが存在します')
else:
    print('存在しません')

.is_file()メソッド:ファイルかどうか判定

p = Path('data/sample.txt') # パスオブジェクトを作成
if p.is_file(): # もしそれがファイルなら(存在する&フォルダでないなら)
    print('これはファイルです')

.is_dir()メソッド:ディレクトリかどうか確認

p = Path('data') # パスオブジェクトを作成
if p.is_dir(): # もしそれがディレクトリ(ファイル)なら(存在する&ファイルでないなら)
    print('これはディレクトリです')

.stat()メソッド:ファイル情報の取得

p = Path('data/sample.txt') # パスオブジェクトを作成
if p.exists():		 # もしそのパスのファイルかフォルダが存在するなら
    info = p.stat()  # そのファイルの情報を取得
    print(f"サイズ: {info.st_size} バイト, 最終更新: {info.st_mtime}")

pathlibでファイル・ディレクトリ操作を行う方法

pathlibはファイル一覧取得やファイル・ディレクトリの作成・削除なども簡潔なコードで実現できます。

ここでは、実際によく使う操作方法をコード例付きで解説します。

ファイル一覧を取得する方法(iterdir・globの使い方)

iterdir()メソッド|ディレクトリ直下のファイル・ディレクトリを取得

全てのファイルの一覧表示に使えるメソッドです。

from pathlib import Path

dir_path = Path('data') # パスオブジェクトを作成
for entry in dir_path.iterdir(): # このパス直下にある全てのファイルを1つずつ
    print(entry)  # 出力する

glob()メソッド|パターンに合致するファイルのみを取得

特定のパターンのファイルの一覧表示に使えるメソッドです。

from pathlib import Path

dir_path = Path('data') # パスオブジェクトを作成
for file_path in dir_path.glob('*.txt'): # このパス直下にある、拡張子がtxtのファイルを1つずつ
    print(file_path)  # 出力する

rglob()メソッド|再帰的にファイル一覧を取得

全ての階層のファイルの一覧表示に使えるメソッドです。

from pathlib import Path

dir_path = Path('data') # パスオブジェクトを作成
for file_path in dir_path.rglob('*.csv'): # このパス以下の全ての階層にある、拡張子がcsvのファイルを1つずつ
    print(file_path)  # 出力する

pathlibでファイル・ディレクトリを作成・削除する方法

mkdir()メソッド|ディレクトリの作成

from pathlib import Path

Path('output/logs').mkdir(parents=True, exist_ok=True)
# Path('output/logs')でパスオブジェクトを作成し、.mkdir()でディレクトリを作成
# parents=Trueにより、親ディレクトリが存在しない場合は一括で作成
# exist_ok=Trueにより、同じ名前のディレクトリが存在していてもエラーを出さずにスルー

touch()メソッド|ファイルの作成

from pathlib import Path

Path('output/empty.txt').touch()
# Path('output/logs')でパスオブジェクトを作成し、.touch()で空ファイルを作成

unlink()メソッド|ファイルの削除

from pathlib import Path

file_path = Path('output/empty.txt') # パスオブジェクトを作成
if file_path.exists():  # もしそのパスのファイルかフォルダが存在するなら
    file_path.unlink()  # そのファイルを削除

rmdir()メソッド|ディレクトリの削除

from pathlib import Path

dir_path = Path('output/logs') # パスオブジェクトを作成
if dir_path.exists(): # もしそのパスのファイルかフォルダが存在するなら
    dir_path.rmdir()  # ディレクトリが空の場合のみ削除

注意:ディレクトリにファイルやサブディレクトリがある場合はrmdir()では削除できません。

その場合はshutil.rmtree()を使いましょう(標準ライブラリshutilが必要です)。

これらの方法で、「ファイル操作」や「ファイル一覧」の取得、ディレクトリ操作を直感的に行うことができます。

pathlibでテキスト・バイナリファイルを簡単に読み書きする方法

pathlibを使うとテキストファイルやバイナリファイルの読み書きもとても簡単に記述できます。

従来のopen()関数を使わずに、Pathオブジェクトのメソッドで直感的に操作できるのが大きな特徴です。

.read_text()メソッド|テキストファイルの読み込み

from pathlib import Path

file_path = Path('data/sample.txt') # パスオブジェクトを作成
if file_path.exists(): # もしそのパスのファイルかフォルダが存在するなら
    content = file_path.read_text(encoding='utf-8') # テキストモードで読み込み、中身をcontentに格納
    print(content)  # ファイルの中身を表示

encodingの指定も可能。日本語ファイルも扱いやすいです。

.write_text()メソッド|テキストファイルへの書き込み

from pathlib import Path

file_path = Path('output/newfile.txt') # パスオブジェクトを作成
text = "こんにちは、Python pathlibのファイル書き込み例です。"

file_path.write_text(text, encoding='utf-8') # UTF-8エンコーディングでテキストファイルとして書き込む
print("ファイルを書き込みました")

.read_bytes()メソッド|バイナリファイルの読み込み

from pathlib import Path

file_path = Path('data/image.png') # パスオブジェクトを作成
if file_path.exists(): # もしそのパスのファイルかフォルダが存在するなら
    data = file_path.read_bytes() #バイナリモードで開き、その中身を「bytes型」(バイト列)として全て読み込む
    print(f"バイト数: {len(data)}")  # ファイルサイズを表示

.write_bytes()メソッド|バイナリファイルへの書き込み

from pathlib import Path

src = Path('data/image.png')  # パスオブジェクトを作成
dst = Path('output/copy.png') # パスオブジェクトを作成

if src.exists():			# もしそのパスのファイルかフォルダが存在するなら
    data = src.read_bytes() # srcのバイナリモード(bytes型)で全て読み込み、data変数に格納
    dst.write_bytes(data)   # 読み込んだバイナリデータdataに書きこむ
    print("画像ファイルをコピーしました")

pathlibの応用テクニック・便利なメソッドまとめ

pathlibには、パスの結合や分割、OS間のパス互換、さらに多彩な便利メソッドが用意されています。

ここでは、知っておくと役立つpathlibの応用テクニックをまとめます。

パスの結合と分割

/ 演算子でパスを簡単に結合

from pathlib import Path

base_dir = Path('data')
file_path = base_dir / 'logs' / '2024' / 'report.txt'
print(file_path)  # data/logs/2024/report.txt

パスの親ディレクトリや名前・拡張子の取得

from pathlib import Path

p = Path('data/sample.txt')
print(p.parent)     # sample.txtの親ディレクトリの名前:data
print(p.name)       # sample.txtの名前:sample.txt
print(p.stem)       # sample.txtの親ディレクトリの拡張子を除く名前:sample
print(p.suffix)     # sample.txtの親ディレクトリの拡張子:.txt

WindowsとUnixのパス互換性

異なるOS間でもパス表記を吸収できるのがpathlibの強みです。

PureWindowsPath / PurePosixPath の使い分け

from pathlib import PureWindowsPath, PurePosixPath

win_path = PureWindowsPath('C:/Users/User/data.txt') # Windows風のパスを作成
posix_path = PurePosixPath('/home/user/data.txt')	 # NIX(LinuxやMacなど)風のパスを作成

print(win_path)    # C:\Users\User\data.txt
print(posix_path)  # /home/user/data.txt

※ Pure系は「パス操作のみ」のクラスで、実際のファイル操作はできません。

OSに応じて自動的にパス区切りを扱う

from pathlib import Path

p = Path('data') / 'sample.txt'
print(p)  # Windowsなら「\」、Unixなら「/」で表示

その他便利なメソッド

resolve()メソッド|絶対パスへの変換

from pathlib import Path

p = Path('data/sample.txt') # パスオブジェクトを作成
print(p.resolve())  # 絶対パスを表示

rename()メソッド|ファイル・ディレクトリ名の変更

from pathlib import Path

p = Path('output/old.txt') 	   # パスオブジェクトを作成
if p.exists():				   # もしそのパスのファイルかフォルダが存在するなら
    p.rename('output/new.txt') # 名称を変更
    print("ファイル名を変更しました")

with_name(), with_suffix()メソッド|パスの一部だけ変更

from pathlib import Path

p = Path('data/sample.txt') # パスオブジェクトを作成
new_name = p.with_name('sample2.txt')   # ファイル名をsample2.txtに変更
new_ext  = p.with_suffix('.csv')        # 拡張子を.csvに変更
print(new_name)  # data/sample2.txt
print(new_ext)   # data/sample.csv

pathlibでよくあるエラーとその解決方法【初心者向け】

Python初心者がpathlibを使う際に出会いやすいエラーやつまずきポイント、その解決策を紹介します。

パスの型エラー

エラー例:「str」と「Path」の混同。Pathオブジェクトと文字列(str型)を混ぜて使うとエラーになります。

from pathlib import Path

p = Path('data/sample.txt')
# open関数にPathオブジェクトをそのまま渡すのはOK
with open(p, encoding='utf-8') as f:
    print(f.read())

# しかし、os.path.join にはPathオブジェクトを渡すとTypeErrorになる
import os
try:
    os.path.join(p, 'test.txt')  # エラー!
except TypeError as e:
    print("TypeError:", e)

対策:Pathオブジェクトとos.pathなど他モジュールで連携する場合は、str()で文字列に変換してから使いましょう。

os.path.join(str(p), 'test.txt')  # OK

パスの区切り文字に関する注意点

  • Windowsでは「\」、Unixでは「/」が使われますが、pathlibを使えば気にせず記述できます。
  • ただし、ハードコードで「\」や「/」を書かないようにしましょう。
from pathlib import Path

# 良い例
p = Path('data') / 'sample.txt'  # OSを気にしなくてOK

# 悪い例
p = Path('data\\sample.txt')  # Windows専用になってしまう

存在しないファイル・ディレクトリへの操作

存在しないパスを読み込もうとするとエラーになります。

.exists()で事前確認しましょう。

from pathlib import Path

p = Path('not_exist.txt')
if not p.exists():
    print("ファイルが存在しません")
else:
    print(p.read_text())

ディレクトリ削除時の注意(rmdirの失敗)

rmdir()は「空のディレクトリ」しか削除できません。

中身がある場合はshutil.rmtree()を使いましょう。

from pathlib import Path
import shutil

dir_path = Path('output/logs')
if dir_path.exists():
    shutil.rmtree(dir_path)  # ディレクトリごと中身も削除

Pythonのos.pathとpathlibを徹底比較【どちらを使うべき?】

Pythonで「ファイル操作」や「ファイル一覧」「ファイル読み書き」を行うとき、従来はos.pathモジュールがよく使われてきました。

ここでは、pathlibos.pathを実際に比較し、どちらを使うべきかを解説します。

os.pathとpathlibの機能・書き方を比較した表

操作内容os.pathpathlib
パス結合os.path.join(a, b)Path(a) / b
ファイル存在確認os.path.exists(path)Path(path).exists()
ファイルか判定os.path.isfile(path)Path(path).is_file()
ディレクトリか判定os.path.isdir(path)Path(path).is_dir()
親ディレクトリ取得os.path.dirname(path)Path(path).parent
拡張子取得os.path.splitext(path)[1]Path(path).suffix
ファイル一覧取得os.listdir(dir_path)Path(dir_path).iterdir(), glob()
テキスト読み書きopen(path).read()/write()Path(path).read_text()/write_text()
パスの絶対化os.path.abspath(path)Path(path).resolve()

現場でpathlibとos.pathどちらを使うべきか?

  • 新しいPythonコードにはpathlibが推奨
    • 可読性が高く、OSごとのパス区切りも気にしなくて良い
    • オブジェクト指向的でエラーも減らせる
  • 既存のos.pathベースのコードや、どうしてもstr型しか扱えないライブラリと連携する場合は、os.pathも有効

pathlibでPythonコードがシンプルになる実例紹介

ファイル一覧を取得して、.txtファイルだけ出力する例。

# os.pathの場合
import os
for filename in os.listdir('data'):
    if filename.endswith('.txt'):
        print(os.path.join('data', filename))
        
# pathlibの場合
from pathlib import Path
for file_path in Path('data').glob('*.txt'):
    print(file_path)

→ コードがより簡潔になり、間違いも減ります。

pathlibのまとめ・おすすめ参考リンク集

pathlibを使いこなせば、ファイル操作やディレクトリ操作がグッと楽になり、Pythonらしい「美しいコード」に近づきます。

ぜひこのガイドを参考に、日々の「ファイル操作」を効率化してください!

pathlibの初心者向けよくある質問・疑問まとめ

Q1. pathlibとos.path、どちらを使えばいいですか?
→ これからPythonを学ぶ、あるいは新規開発なら pathlibが断然オススメ です。既存の古いコードや、外部ライブラリの仕様によってはos.pathも使われることがありますが、標準はpathlibでOKです。

Q2. ファイルやディレクトリ操作で迷ったときは?
→ Pathオブジェクトの.exists(), .is_file(), .is_dir()などで事前確認すると、エラーを減らせます。

Q3. Windows/Mac/Linuxどれでも動きますか?
→ はい、pathlibはOSごとのパス区切りを自動判別してくれます。基本的にOSを意識せず書けます。

Q4. pathlibでopen関数を使ってもいいですか?
→ Pathオブジェクトをopen関数に渡すこともできますが、.read_text().write_text()のほうがシンプルです。

pathlibの公式ドキュメント・学習に役立つリンク集

記事URLをコピーしました