言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Python辞典

  1. トップページ
  2. Python辞典
  3. os.path.join() / os.path.exists() / os.path.basename()

os.path.join() / os.path.exists() / os.path.basename()

対応: Python 2(2000)

ファイルパスを組み立てたり、パスの各部分を取り出したりする『os.path』モジュールの関数です。OSの違い(Windows/Mac/Linux)を吸収して安全にパスを操作できます。

構文

import os

# パスを結合する
os.path.join(パス1, パス2, ...)

# ファイル・ディレクトリが存在するか確認する
os.path.exists(パス)

# パスの末尾部分(ファイル名)を取得する
os.path.basename(パス)

# パスのディレクトリ部分を取得する
os.path.dirname(パス)

# 拡張子とファイル名を分割する
os.path.splitext(パス)

# 絶対パスに変換する
os.path.abspath(パス)

関数一覧

関数概要
os.path.join(p1, p2, ...)複数のパス要素を結合して1つのパス文字列を返します。OS固有のパス区切り文字(『/』または『\』)を自動で使用します。
os.path.exists(パス)指定したパスにファイルまたはディレクトリが存在する場合に『True』を返します。
os.path.basename(パス)パスの末尾部分(ファイル名またはディレクトリ名)を返します。
os.path.dirname(パス)パスのディレクトリ部分を返します。
os.path.splitext(パス)パスを『(ファイル名部分, 拡張子)』のタプルに分割して返します。
os.path.abspath(パス)相対パスを絶対パスに変換して返します。
os.path.isfile(パス)パスが存在するファイルを指している場合に『True』を返します。
os.path.isdir(パス)パスが存在するディレクトリを指している場合に『True』を返します。

サンプルコード

os_path_1.py
import os

base_dir = '/Users/kiryu/documents'
filename = 'report.txt'
full_path = os.path.join(base_dir, 'reports', filename)
print(full_path)

path = '/var/www/html/index.php'
print(os.path.basename(path))
print(os.path.dirname(path))

実行すると次のように出力されます。

python3 os_path_1.py
/Users/kiryu/documents/reports/report.txt
index.php
/var/www/html
os_path_2.py
import os

name, ext = os.path.splitext('photo.jpg')
print(name)
print(ext)

src = 'document.txt'
dst = os.path.splitext(src)[0] + '.md'
print(dst)

print(os.path.abspath('.'))
print(os.path.abspath('../data'))

実行すると次のように出力されます。

python3 os_path_2.py
photo
.jpg
document.md
/home/kiryu/projects
/home/kiryu/data
os_path_3.py
import os

print(os.path.exists('/etc/hosts'))
print(os.path.exists('/存在しないパス'))

print(os.path.isfile('/etc/hosts'))
print(os.path.isdir('/etc'))

実行すると次のように出力されます。

python3 os_path_3.py
True
False
True
True

よくあるミス

よくあるミス1: パスを文字列結合で組み立てる

『+』演算子でパスを連結すると、WindowsとMac/Linuxで区切り文字が異なるため、環境によって動作が変わります。『os.path.join()』を使うとOSによるパス区切り文字の差異を吸収できます。

import os

base_dir = '/var/www'
filename = 'index.html'
path = base_dir + '/' + filename
print(path)
mistake1_ok.py
import os

base_dir = '/var/www'
filename = 'index.html'
path = os.path.join(base_dir, filename)
print(path)

実行すると次のように出力されます。

python3 mistake1_ok.py
/var/www/index.html

よくあるミス2: exists()を確認せずにファイルを開く

ファイルが存在しない状態で直接開こうとすると『FileNotFoundError』が発生します。事前に『os.path.exists()』または『os.path.isfile()』で確認するか、try-exceptで例外処理します。

mistake2_ng.py
import os

path = '/存在しないファイル.txt'
with open(path, 'r') as f:
    content = f.read()

実行すると次のように出力されます。

python3 mistake2_ng.py
FileNotFoundError: [Errno 2] No such file or directory: '/存在しないファイル.txt'
mistake2_ok.py
import os

path = '/存在しないファイル.txt'
if os.path.isfile(path):
    with open(path, 'r') as f:
        content = f.read()
else:
    print('ファイルが見つかりません')

実行すると次のように出力されます。

python3 mistake2_ok.py
ファイルが見つかりません

概要

『os.path.join()』はOSに応じた区切り文字(Windowsでは『\』、Mac/Linuxでは『/』)を使ってパスを結合します。パスを文字列結合(『+』演算子)で組み立てると環境によって動作が変わるため、『os.path.join()』を使うとOSによるパス区切り文字の差異を吸収できます。

Python 3.4以降は同様の機能をよりオブジェクト指向的に扱える『pathlib』モジュールが利用できます。オブジェクト指向でパスを操作したい場合は『pathlib.Path』を使う方法もあります。ただし既存のコードや外部ライブラリとの互換性のため、『os.path』が依然として広く使われています。

モダンなパス操作は『pathlib.Path()』を参照してください。ディレクトリ操作は『os.listdir() / os.makedirs() / os.remove()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。