
こんにちは、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