0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Python / path / windows 対応] path の join や split を、複数OSに対応できるコードにしたいとき

Posted at

1. 概要

以下のような事情の方には、ちょうど良い記事になると思います。

  • Linux や Mac では path の区切りが "/" だが、 windows では "\\" とする必要がある
  • この OS 間の差異のせいでエラーが発生している
  • このエラーを解消し、どの OS でも同じソースコードを実行できるようにしたい
  • でも条件分岐 (if文) は書きたくない

if 分を使えば、両方の OS に対応するコードも書けますけどね、そのためにわざわざ書きたくないですよね。
そんな場合の対応方法を以下に記述しています。

2. 対応方法

2-1. split を置き換える

Linux / Mac などで、こんな処理を書いていたとします。

before
>>> path = "/root/src/hoge.txt"
>>> path.split("/")
['', 'root', 'src', 'hoge.txt']

これだと、 path 区切りが "\" になった途端処理結果が変わってしまいますよね。
そこで以下のようにします。

after
>>> 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 を置き換える

次は、こんな処理を書いていたとしましょう。

before
>>> 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 を使う

after
>>> 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 を使う

以下のように書くこともできるみたいです。

after2
>>> from pathlib import Path
>>> Path("dir_name").joinpath("class", "file_name.txt")
PosixPath('dir_name/class/file_name.txt')

PosixPath は簡単に文字列型にキャストできるので、この方法で変換しても良いでしょう。

str へ cast
>>> str(Path("dir_name").joinpath("class", "file_name.txt"))
'dir_name/class/file_name.txt'

これらの結果も、 OS によって自動で区切り文字が切り替わるのでとても便利です^^

3. 関連記事

pathlib.Path には他にも便利な機能が盛りだくさんみたいです。
私は今のところ必要ないので触れていませんが、興味がある方には以下の記事が面白いかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?