[解決!Python]os.path.join関数を使ってパスを結合するには解決!Python

os.path.join関数を使って相対パスや絶対パスを結合する方法や、最後にパス区切り文字を付加する方法、Windowsのドライブ文字の扱いなどについて紹介する。

» 2022年11月22日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

from os.path import join

# UNIX系統のOSの場合
# 相対パスの結合
result = join('foo', 'bar', 'baz.txt')
print(result)  # foo/bar/baz.txt

# 絶対パスの結合
result = join('/foo', 'bar', 'baz.txt')
print(result)  # /foo/bar/baz.txt

# 引数の途中に絶対パスが含まれている場合
result = join('foo', '/bar', 'baz.txt')
print(result)  # /bar/baz.txt

# 引数の最後を空文字列にすると区切り文字でパスが終わる
result = join('foo', 'bar', 'baz', '')
print(result)  # foo/bar/baz/

data = 'data'
start_year = 2020
end_year = 2022
for year in range(start_year, end_year+1):
    for month in range(1, 13):
        path = join(data, f'{year}', f'{month:02}', '')
        # data/2020/01/、data/2020/02/などのパスを使って何らかの処理を行う
        print(path)

# Windowsの場合
# 相対パスの結合
result = join('foo', 'bar', 'baz.txt')
print(result)  # foo\bar\baz.txt

# 絶対パスの結合
result = join('\\foo', 'bar', 'baz.txt')
print(result)  # \foo\bar\baz.txt

# 引数の途中に絶対パスが含まれている場合
result = join('foo', '\\bar', 'baz.txt')
print(result)  # c:\bar\baz.txt

# 絶対パスの結合(ドライブ文字を含む)
result = join('c:', '\\foo', 'bar', 'baz.txt')
print(result)  # c:\foo\bar\baz.txt

# ドライブ文字とパスだけを含む場合
result = join('d:', 'foo')
print(result)  # d:foo

# 引数の最後を空文字列にすると区切り文字でパスが終わる
result = join('foo', 'bar', 'baz', '')
print(result)  # foo\bar\baz\

data = 'data'
start_year = 2020
end_year = 2022
for year in range(start_year, end_year+1):
    for month in range(1, 13):
        path = join(data, f'{year}', f'{month:02}', '')
        # data\2020\01\、data\2020\02\などのパスを使って何らかの処理を行う
        print(path)


パスの結合

 os.pathモジュールのjoin関数を使うと、パスを構成する各要素を結合できる(このとき、使用しているOSで決められているパス区切り文字がパスとパスの間に挟み込まれる)。join関数には1つ以上の文字列(またはPathオブジェクトなど)を指定する。

 以下にmacOSで実行した例を示す。

result = join('foo', 'bar', 'baz.txt')
print(result)  # foo/bar/baz.txt


 この例では、join関数に'foo'、'bar'、'baz.txt'という3つの文字列を渡している。その結果は、これらをパス区切り文字であるスラッシュ「/」を使って結合した「foo/bar/baz.txt」となる。

 Windowsでは次のようになる。

result = join('foo', 'bar', 'baz.txt')
print(result)  # foo\bar\baz.txt


 Windowsではパス区切り文字がバックスラッシュ「\」になっているが、それ以外は同様だ。

 上の例は相対パスを結合したものだが、絶対パスであっても同様に結合できる。以下はその例だ(macOS)。

result = join('/foo', 'bar', 'baz.txt')
print(result)  # /foo/bar/baz.txt


 パスを結合して、絶対パスにするには最初の引数をパス区切り文字で始めるのが簡単だ。だが、引数の中に絶対パスを含めることも可能だ。この場合、その引数よりも前に置いたパス構成要素は無視され、引数に並べた絶対パス以降の要素が結合される。

result = join('foo', '/bar', 'baz.txt')
print(result)  # /bar/baz.txt


 この例では第2引数がスラッシュ「/」で始まっている(つまり、これは絶対パス)。そのため、第1引数は無視されて、第2引数と第3引数を結合した結果が返されている。

 このことはWindowsでも同様だ。以下に例を示す。

result = join('\\foo', 'bar', 'baz.txt')
print(result)  # \foo\bar\baz.txt


Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。