Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

Pythonのpathlibモジュールを使おう

こんにちは、PyQチームです。
Pythonでファイルやディレクトリを扱うモジュールとして、osモジュールとpathlibモジュールがあります。
これらのモジュールはどちらもPythonの標準モジュールですが、新しいpathlibモジュールはosモジュールよりも使いやすくなるように設計されています。また、Python 3.12でpathlibにいくつもの修正が加わりました。
今回は、pathlibモジュールの使い方を簡単に紹介します。

pathlibモジュールは、パスをPathで表現

pathlibモジュールでは、ファイルなどのパスをPathというクラスで表現します。
このPathのオブジェクトを使うことでいろいろな処理を実行できます。
確認してみましょう。

Pathオブジェクトの作成とパスの連結

Pathオブジェクトは、次のように作成します。なお、実行結果はmacOSやLinuxで動かした場合のものです。Windowsでも同じコードが動きますが、以降の結果では一部表示が変わります。

from pathlib import Path

tmp_path = Path("tmp")
print(tmp_path)

実行結果

tmp

ディレクトリの作成

mkdir()メソッドでディレクトリを作成できます。

tmp_path.mkdir(exist_ok=True)

exist_ok=Trueをつけることで、ディレクトリが存在している場合でもエラーになりません。

パスの連結

作成したオブジェクトは、/で文字列と連結できます。

file_path = tmp_path / "test.txt"
print(file_path)

実行結果

tmp/test.txt

ファイルへの書き込み

Pathオブジェクトには、write_text()というメソッドがあります。
このメソッドを使うと、ファイルに文字列を書き込めます。

file_path.write_text("こんにちは", encoding="utf-8")

上記のコードは、次の処理と同等です。pathlibを使うとファイルオブジェクト(fp)を意識しなくてよいので、便利ですね。

with open(file_path, "w", encoding="utf-8") as fp:
    fp.write("こんにちは")

ファイルからの読み込み

ファイルからの読み込みもread_text()というメソッドでできます。

print(file_path.read_text(encoding="utf-8"))

実行結果

こんにちは

ディレクトリ内のファイルやディレクトリの取得

ディレクトリ内のファイルやディレクトリの取得は、iterdir()メソッドでできます。今回は、次のようなディレクトリ構成について考えます。

- tmp
    - subdir
        - some.txt
    - test.txt

上記の構成で次のコードを実行すると、tmp直下のファイルとディレクトリを取得できます。

print(list(tmp_path.iterdir()))

実行結果

[PosixPath('tmp/subdir'), PosixPath('tmp/test.txt')]

同じことは、glob()メソッドでもできます。引数の"*"はすべてのディレクトリとファイルにマッチするワイルドカードです。もし、拡張子が.txtのファイルだけ取得したい場合は、glob("*.txt")のようにするとできます。

print(list(tmp_path.glob("*")))

実行結果

[PosixPath('tmp/subdir'), PosixPath('tmp/test.txt')]

また、glob()メソッドの代わりにrglob()メソッドを使うと、ディレクトリを再帰的に取得できます。

print(list(tmp_path.rglob("*")))

実行結果

[PosixPath('tmp/subdir'), PosixPath('tmp/subdir/some.txt'), PosixPath('tmp/test.txt')]

階層ごとにディレクトリとファイルを分けて取得したい場合は、walk()メソッドを使います。このメソッドはos.walk()関数に対応するもので、Python 3.12で追加されました。

for target_dir, dirs, files in tmp_path.walk():
    print(target_dir)  # 対象ディレクトリ
    for dir_ in dirs:  # ディレクトリ一覧
        print(f"  dir: {dir_}")
    for file in files:  # ファイル一覧
        print(f"  file: {file}")

実行結果

tmp
  dir: subdir
  file: test.txt
tmp/subdir
  file: some.txt

カレントディレクトリの取得

カレントディレクトリ(現在実行中のディレクトリー)を取得するには、Path.cwd()関数を使います。戻り値はPathオブジェクトなので、ここまで説明したような便利なメソッドを使うことができます。

print(Path.cwd())

実行結果

/Users/tsutomu

なお、カレントディレクトリについて知りたい方は、次のPyQドキュメントをご覧ください。

まとめ

ファイルやディレクトリを扱う場合は、pathlibモジュールのPathオブジェクトを使いましょう。
どのOSでも同じコードで、わかりやすく記述できます。
また、ここで紹介しきれなかった機能は、次の公式ドキュメントを参照してください。

  • pathlib --- オブジェクト指向のファイルシステムパス - 公式ドキュメント docs.python.org

PyQでは、次のパートでpathlibモジュールを学べます。

  • 「pathlib」パート pyq.jp
Copyright ©2017- BeProud Inc. All rights reserved.