1. 概要
以下のような事情の方には、ちょうど良い記事になると思います。
- Linux や Mac では path の区切りが
"/"
だが、 windows では"\\"
とする必要がある - この OS 間の差異のせいでエラーが発生している
- このエラーを解消し、どの OS でも同じソースコードを実行できるようにしたい
- でも条件分岐 (if文) は書きたくない
if
分を使えば、両方の OS に対応するコードも書けますけどね、そのためにわざわざ書きたくないですよね。
そんな場合の対応方法を以下に記述しています。
2. 対応方法
2-1. split を置き換える
Linux / Mac などで、こんな処理を書いていたとします。
>>> path = "/root/src/hoge.txt"
>>> path.split("/")
['', 'root', 'src', 'hoge.txt']
これだと、 path 区切りが "\" になった途端処理結果が変わってしまいますよね。
そこで以下のようにします。
>>> from pathlib import Path
>>> path = "/root/src/hoge.txt"
>>> _path = Path(path)
>>> _path.parts
('/', 'root', 'src', 'hoge.txt')
これでいい感じになります。windows の形式の path ("C:\\root\\src\\hoge.txt"
)も分割してくれます。
まぁ若干差はあるんですけどね。それは戻り値の先頭部分です(''
なのか '/'
なのかが変わるので注意)
path の後ろの方だけを使うのであれば、ほぼ同等の結果が得られます。
2-2. join を置き換える
次は、こんな処理を書いていたとしましょう。
>>> path_parts = ["dir_name", "class", "file_name.txt"]
>>> "/".join(path_parts)
"dir_name/class/file_name.txt"
これだと、 windows では処理できない path が生成されてしまいます。
この対処法は2種類あります。
2-2-1. os.path.join を使う
>>> import os
>>> path_parts = ["dir_name", "class", "file_name.txt"]
>>> os.path.join(*path_parts)
"dir_name/class/file_name.txt" # この結果は OS によって変わる
注目すべきは os.path.join()
の処理結果です。
この方法なら、 path の区切り文字をこちらで指定しなくても、自動で判定して補ってくれます。
MacやLinuxなら自動で "/"
に、 windows なら自動で "\\"
をディレクトリ間の区切り文字として使ってくれます。
2-2-2. Path.joinpath を使う
以下のように書くこともできるみたいです。
>>> from pathlib import Path
>>> Path("dir_name").joinpath("class", "file_name.txt")
PosixPath('dir_name/class/file_name.txt')
PosixPath
は簡単に文字列型にキャストできるので、この方法で変換しても良いでしょう。
>>> str(Path("dir_name").joinpath("class", "file_name.txt"))
'dir_name/class/file_name.txt'
これらの結果も、 OS によって自動で区切り文字が切り替わるのでとても便利です^^
3. 関連記事
pathlib.Path
には他にも便利な機能が盛りだくさんみたいです。
私は今のところ必要ないので触れていませんが、興味がある方には以下の記事が面白いかもしれません。