今回は、Pythonでディレクトリを移動する方法についてご紹介します。
Pythonでは、ディレクトリを移動する際にosモジュールを活用します。
os.chdir()を使うと、指定したパスに作業ディレクトリを変更できます。
ただし、プログラム全体やマルチスレッド環境で実行する際は、予期しない影響を与えないように注意が必要です。
以下では、ディレクトリ変更の基本から、コンテキストマネージャを用いた一時的な変更方法、外部コマンド実行時のディレクトリ指定などを解説します。
Pythonでディレクトリを移動する基本的な方法
os.chdir()を使うと、絶対パスあるいは相対パスを指定してディレクトリを変更できます。
絶対パスでの移動
絶対パスを指定すれば、どこからでも正確に目的のディレクトリへ移動できます。
1 2 3 4 5 |
import os # 絶対パスの例 os.chdir("/path/to/directory") print("現在のディレクトリ:", os.getcwd()) |
現在のディレクトリ: /path/to/directory
os.getcwd()で現在の作業ディレクトリを確認できます。
相対パスでの移動
相対パスを指定することで、今いるディレクトリを基準とした移動ができます。
1 2 3 4 5 |
import os # 相対パスで一つ上のディレクトリへ移動 os.chdir("..") print("親ディレクトリに移動:", os.getcwd()) |
親ディレクトリに移動: /path
相対パスを使う場合は、どの位置から移動するのかを明確に理解しておくことが大切です。
pathlibモジュールを利用したディレクトリ移動
pathlibはパスをオブジェクトとして扱えるため、コードをより直感的に書けます。
ただし、ディレクトリの移動自体はos.chdir()を使う必要があります。
1 2 3 4 5 6 |
from pathlib import Path import os new_dir = Path("/path/to/directory") os.chdir(new_dir) print("新しい作業ディレクトリ:", os.getcwd()) |
新しい作業ディレクトリ: /path/to/directory
Pathオブジェクトを直接os.chdir()に渡せる点が特徴です。
一時的にディレクトリを移動する方法(コンテキストマネージャ)
一時的にディレクトリを変更し、処理が終わったら自動的に元のディレクトリに戻したい場合はコンテキストマネージャを利用すると便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import os from contextlib import contextmanager @contextmanager def change_directory(new_dir): original_dir = os.getcwd() os.chdir(new_dir) try: yield finally: os.chdir(original_dir) # 使用例 with change_directory("/path/to/directory"): print("一時的な作業ディレクトリ:", os.getcwd()) print("元のディレクトリに戻りました:", os.getcwd()) |
一時的な作業ディレクトリ: /path/to/directory
元のディレクトリに戻りました: /path
ブロック内では新しいディレクトリが設定され、ブロックを抜けると元のディレクトリに戻ります。
外部コマンド実行時に作業ディレクトリを指定する方法
Pythonから外部コマンドを呼び出す場合、subprocessを利用することがあります。
このとき、subprocess.run()などのcwd引数で実行時のディレクトリを指定可能です。
1 2 3 4 |
import subprocess # "ls -l"コマンドを/path/to/directory内で実行する result = subprocess.run(["ls", "-l"], cwd="/path/to/directory") |
この方法では、Pythonのプロセス自体の作業ディレクトリは変更されないため、限定的にディレクトリを変更したい場合に有効です。
ディレクトリ変更時の注意点とよくあるエラー
FileNotFoundErrorの発生を防ぐには、移動先ディレクトリが存在しているかどうかを事前に確認することが大切です。
os.chdir()でディレクトリを変更すると、同じプロセス内で動作する他の処理に影響を与える可能性があります。
マルチスレッド環境ではコンテキストマネージャを使ってスコープを限定すると、予期しない動作を防ぎやすくなります。
また、相対パスに依存したコードでは、カレントディレクトリが変わると思わぬ不具合が生じることもあるため、必要に応じて絶対パスを使うことが推奨されます。
まとめ
ディレクトリを変更する場合はos.chdir()が基本となり、pathlibやコンテキストマネージャを組み合わせると柔軟に扱えます。
外部コマンドを呼び出す際は、subprocessのcwd引数が便利です。
パスの存在確認や影響範囲の管理を意識しながら、安全にディレクトリ移動を行いましょう。