パス (path)
パス (path) とはファイルあるいはフォルダ (ディレクトリ) の位置を示す情報です。パスの記述形式は OS ごとに異なります。たとえば Windows の場合、ファイルやフォルダをバックスラッシュ (\) で区切って階層構造を表記します。
C:\Users\blogcat\Desktop\mydata.csv
Mac や Linux では
/home/desktop/mydata.csv
のように、階層をスラッシュ (/) で区切ります。
絶対パス(absolute path)
階層構造の頂点 (ルートディレクトリ) を起点に目的のファイルやフォルダまでの経路情報をすべて記述したパスを絶対パス (absolute path) またはフルパス (full path) とよびます。
Windows であれば、ドライブ名から始まる
C:\Users\blogcat\Desktop\mydata.csv
のような記述が絶対パスです。Mac や Linux ではルートディレクトリをスラッシュで表し、
/home/desktop/mydata.csv
のように記述すると絶対パスとなります。
相対パス (relative path)
作業フォルダ (カレントディレクトリ) を起点に目的のファイルやフォルダまでの経路情報を記載したパスを相対パス(relative path) といいます。たとえば、Windows で作業フォルダの下に blogcat というフォルダがあって、その下に mycode.ipynb というファイルが存在する場合は
blogcat\mycode.ipynb
のように指定します。Mac や Linux であれば現在の位置を表すドット (.) を先頭に添えて
./blogcat/mycode.ipynb
と記述します。ちなみに .ipynb は Jupyter Notebook のファイルの拡張子です。
Windowsのパス
Windows ではバックスラッシュ (\) でパスを区切るので、Python で Windows のパスを文字列として扱う場合は、raw 文字 r などを使ってバックスラッシュ (\) をエスケープしておきます。
file_path = r"C:\Users\blogcat\mycode.ipynb"
後述する os.path.join() を使えば、OS に合わせたパスを組み立てることができます。
パスの取得や操作に用いる関数
os.getcwd()
os.getcwd() は作業フォルダ (カレントディレクトリ) の絶対パスを取得します。
# PYTHON_OS_GETCWD # In[1] import os # 作業フォルダを取得 folder_name = os.getcwd() print(folder_name) # C:\Users\blogcat
os.path.abspath()
os.path.abspath() に文字列を渡すと、作業フォルダの絶対パスに文字列を連結したパスを生成します。
# PYTHON_OS_PATH_ABSPATH # In[1] from os import path # 作業フォルダの下に"mybook"を連結したパスを生成 p = path.abspath("mybook") print(p) # C:\Users\blogcat\mybook
os.path.join()
os.path.join() に複数の文字列を渡すと、実行中の OS の区切り文字を使ってパスを組み立てます。
# PYTHON_OS_PATH_JOIN # In[1] from os import path # 使用中のOSに合わせてパスを組み立てる p = path.join("C:", "Users", "blogcat", "mycode.ipynb") print(p) # C:Users\blogcat\mycode.ipynb
ファイル名やフォルダ名のリストを作って os.path.join() に渡すこともできます。その場合は引数の先頭にアスタリスク (*) を付けます。
# In[2] name_list = ["C:", "Users", "blogcat", "mycode.ipynb"] # 使用中のOSに合わせてパスを組み立てる p = path.join(*name_list) print(p) # C:Users\blogcat\mycode.ipynb
コメント
下記は誤植と思われますので、ご確認ください。
「絶対パス」の説明で、バックスラッシュで表し、→ スラッシュで表し、
「相対パス」の説明で、.blogcat/mycode.ipynb → ./blogcat/mycode.ipynb
ありがとうございます。m(_ _)m
訂正しておきました。