torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

Python、os.path.join()でパスを結合する

Python Python標準ライブラリ
2016年5月25日2:28
os.path.join()は、賢くパスを結合してくれます。
これはWindowsのパスなのか、Macなのか、といった些細な悩みから開放してくれるため、パスの結合はこれ一つでほぼ問題ないでしょう、

基本的な使い方は以下のようになります。
css_path = os.path.join("css", "style.css")
img_path = os.path.join("assets", "img", "inu.png")


join()の引数にリストを渡したい、という場合があります。
その場合は以下のようにします。
path_list = ["css", "style.css"]
css_path = os.path.join(*path_list)


上記のコードで、更に絶対パスを得たい場合は以下のようにするとよいでしょう。
path_list = ["css", "style.css"]
 
# 実行ファイルがあるディレクトリの絶対パスを取得
current_dir = os.path.dirname(os.path.abspath(__file__))
 
 
path1 = os.path.join(current_dir, *path_list)
path2 = os.path.join(current_dir, "css", "style.css")


今まで作成したpathは、open()等の引数に使うことができます。
with open(path1, 'w') as file:
    file.write("こんにちは")


おまけですが、例えば以下のようなパスでファイルを作りたい場合です。
C:\MyMercurial\python\cui\test\css\style.css


現在のディレクトリが「test」だった場合、style.cssは直接作れません。
cssディレクトリが必要になる為です。
このコードは、cssディレクトリがないとエラー
    path_list = ["css", "style.css"]
    path1 = os.path.join(*path_list)
    with open(path1, 'w') as file:
        file.write("こんにちは")
 
FileNotFoundError: [Errno 2] No such file or directory: 'css\style.css'


以下のように、os.mkdirを使えば問題は解決しますが...
    path_list = ["css", "style.css"]
    path1 = os.path.join(*path_list)
    os.mkdir("css")
    with open(path1, 'w') as file:
        file.write("こんにちは")


cssの部分がjsになったりフォルダ名が特定できない場合や、
test/test1/test2/test.txtのように階層が深い場合は処理が複雑になります。


Python3.2以上ならば、この問題は以下のコードで解決できます。
path_listがどれだけ複雑になっても、途中のフォルダが存在しなければ適切にフォルダを作成します。
    path_list = ["test", "test1", "test2", "test.txt"]
    path1 = os.path.join(*path_list)
    os.makedirs(os.path.dirname(path1), exist_ok=True)  # 便利。ただし、作るのはあくまでディレクトリ。なのでdirname
    with open(path1, 'w') as file:
        file.write("こんにちは")



http://stackoverflow.com/questions/14826888/python-os-path-join-on-a-list
http://stackoverflow.com/questions/12517451/python-automatically-creating-directories-with-file-output