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()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。