Pythonでファイルパスを組み立てる方法について解説します。
ファイルパスを組み立てる方法
プログラミングをしていると文字列を使ってファイルパスを組み立てるような場面によく直面します。
Pythonでは、os.path.joinを使用する方法とpathlibモジュールのjoinpathメソッドを使用する方法があります。
本記事では、Pythonでファイルパスを組み立てる方法について簡単な例を用いて説明します。
os.path.joinを使用する方法
ファイルパスを組み立てる方法としてos.path.joinを使用ができます。os.path.joinは、環境に応じたパス区切り文字を補ってくれるため、環境に合わせた区切り文字の判定等を考慮する必要がありません。
import os target_path = r"D:\test" # 対象フォルダ内のファイル名を順に取得し、パスを作成 for f in os.listdir(target_path): # os.path.joinでフォルダパスとファイル名を結合 tmp_path = os.path.join(target_path, f) print(tmp_path) print("=====") # 新しいファイル用のパスを作成 new_path = os.path.join(target_path, "tmp", "sample4.txt") print(new_path)
D:\test\sample1.txt D:\test\sample2.txt D:\test\sample3.txt ===== D:\test\tmp\sample4.txt
上記例は、あらかじめDドライブにtestというフォルダを作成して、sample1.txt, sample2.txt, sample3.txtというファイルを用意してあることを前提に実行した結果です。試す場合には任意のフォルダにファイル等を作って変更して試してみてください。
os.listdirで対象フォルダのファイル名をリストアップできるため、取得できたファイル名を使ってos.path.joinでパスを作成しています。
また、新しいsample4.txt用のパスを作成したい場合にも簡単に作成できます。os.path.joinの引数には連結対象の複数の文字列を指定できるため、パス上のフォルダ名等を複数指定してパスを作ることができます。
os.path.joinの公式ドキュメントはこちらを参照してください。
pathlibモジュールのjoinpathメソッドを使用する方法
上記のos.path.joinは文字列として簡単にファイルパスを作るのに便利でした。他にも高水準なパスオブジェクトを提供してくれるpathlibモジュールというものがあります。
pathlibモジュールでは、ファイルシステムのパスを表すクラスを提供してくれているため、各種便利なメソッドなどを使用することができます。上記で紹介したos.path.joinと同じ内容をpathlibで実現する例を見てみましょう。
import pathlib target_path = r"D:\test" # Pathオブジェクトを作成 path = pathlib.Path(r"D:\test") # 対象フォルダ内のファイルを取得 file_path = [x for x in path.iterdir() if x.is_file()] print(file_path) # 色々なメソッドを使用することが可能 print(file_path[0].is_file()) print(file_path[0].is_dir()) print(file_path[0].drive) print(file_path[0].name) print("=====") # 新しいファイル用のパスを作成 new_path = path.joinpath("tmp", "sample4.txt") print(new_path) print(type(new_path))
【実行結果】 [WindowsPath('D:/test/sample1.txt'), WindowsPath('D:/test/sample2.txt'), WindowsPath('D:/test/sample3.txt')] True False D: sample1.txt ===== D:\test\tmp\sample4.txt <class 'pathlib.WindowsPath'>
以降でポイントを説明していきます。
import pathlib target_path = r"D:\test" # Pathオブジェクトを作成 path = pathlib.Path(r"D:\test")
まずは、pathlibモジュールをインポートし、pathlib.Pathに対象のパスを渡すことでパス用のオブジェクトを作成します。
Pathオブジェクトはiter_dir()を用いることでファイルパスを順次取得できます。リスト内包表記を使って、各ファイルパスを取得していますが「if x.is_file()」とすることでファイルの場合のみ取得しています。例えば、この部分をx.is_dir()とすればディレクトリ(フォルダ)のみを取得することも可能です。
# 対象フォルダ内のファイルを取得 file_path = [x for x in path.iterdir() if x.is_file()] print(file_path) # 色々なメソッドを使用することが可能 print(file_path[0].is_file()) print(file_path[0].is_dir()) print(file_path[0].drive) print(file_path[0].name)
os.path.joinで扱うパスは文字列ですが、pathlibで扱うのはパス用のオブジェクトのため、is_file()やis_dir()でファイルなのかフォルダなのかを判定したり、drive, nameといったプロパティで各種情報にアクセスすることができるため非常に便利です。
# 新しいファイル用のパスを作成 new_path = path.joinpath('tmp', 'sample4.txt') print(new_path) print(type(new_path))
新しいパスを作成したい場合には、上記のようにjoinpathメソッドを使用することができます。os.path.joinと同様に複数の文字列を指定できるため、パス上のフォルダ名等を複数指定してパスを作ることができます。
お手軽にパス文字列を作成するだけであれば、os.path.joinで十分ですが、プログラム中で各種パスの情報を参照しながら処理をする場合は、各種便利なメソッドが使用できるため、pathlibの利用を検討するとよいでしょう。
文字列を連結・結合する方法については「文字列を連結・結合する方法」でまとめていますので興味があれば参考にしてください。
まとめ
Pythonでファイルパスを組み立てる方法について解説しました。
Pythonでは、os.path.joinを使用する方法とpathlibモジュールのjoinpathメソッドを使用する方法があります。
お手軽にパス文字列を作成するだけであれば、os.path.joinで十分ですが、プログラム中で各種パスの情報を参照しながら処理をする場合は、各種便利なメソッドが使用できるため、pathlibの利用を検討するとよいでしょう。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。