こんにちは、PyQチームです。
Pythonでファイルやディレクトリを扱うモジュールとして、osモジュールとpathlibモジュールがあります。
これらのモジュールはどちらもPythonの標準モジュールですが、新しいpathlibモジュールはosモジュールよりも使いやすくなるように設計されています。また、Python 3.12でpathlibにいくつもの修正が加わりました。
今回は、pathlibモジュールの使い方を簡単に紹介します。
- pathlibモジュールは、パスをPathで表現
- Pathオブジェクトの作成とパスの連結
- ディレクトリの作成
- パスの連結
- ファイルへの書き込み
- ファイルからの読み込み
- ディレクトリ内のファイルやディレクトリの取得
- カレントディレクトリの取得
- まとめ
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ドキュメントをご覧ください。
- パス - PyQ ドキュメント docs.pyq.jp
まとめ
ファイルやディレクトリを扱う場合は、pathlibモジュールのPath
オブジェクトを使いましょう。
どのOSでも同じコードで、わかりやすく記述できます。
また、ここで紹介しきれなかった機能は、次の公式ドキュメントを参照してください。
- pathlib --- オブジェクト指向のファイルシステムパス - 公式ドキュメント docs.python.org
PyQでは、次のパートでpathlibモジュールを学べます。
- 「pathlib」パート pyq.jp