Python

Pythonのパス(相対パス・絶対パス)の使い方を解説

By 2022年3月19日No Comments

本記事では、パス(相対パス・絶対パス)とは何かを説明し、Pythonではどのようにパスを扱うかについても解説していきます。

パスとは?

パスとは、ファイルシステムにおける、ファイルやディレクトリーの場所を表すためのものです。なお、ディレクトリはWindowsで言う「フォルダ」と似たような意味の言葉であり、ファイルをいくつかまとめた入れ物を指します。

パスには、絶対パスと相対パスの2種類があります。

絶対パス

絶対パスとは、あるファイルやディレクトリの場所を表す方法として、ファイルシステムのルート(先頭のディレクトリー)から辿って表記したパスのことです。

MacやLinuxでの絶対パスの書き方は、ディレクトリーやファイル毎の切れ目を「/」の記号で表し、先頭のディレクトリから順につなげて表記します。なお、先頭のディレクトリーは「/」で表します。

(ルート)
  │
  ├── dir1
  │   ├── file1.txt
  │   ├── file2.txt
  │   └── dir2
  │        ├──── file4.txt
  │        └──── file5.txt
  └── file3.txt

ファイルシステム上で、上記のようにディレクトリとファイルが管理されているとします。

上記の「file4.txt」の絶対パスは、

「/dir1/dir2/file4.txt」となります。

パスの先頭に、ルートを表す「/」が必要であることに注意してください。

Windowsの場合は、区切り文字を「\(バックスラッシュ」で表します。

また、ルートにはドライブ名を指定する必要があり、Cドライブの場合は「C:\」と表記します。

「file4.txt」がCドライブ内にある場合、絶対パスは、

「C:\dir1\dir2\file4.txt」となります。

カレントディレクトリー

相対パスを理解するためには、カレントディレクトリについての理解が必要です。

カレントディレクトリーとは、実行中のソフトウェアなどがファイルシステム中で現在位置として指し示しているディレクトリのことです。Pythonの場合は、Pythonファイルを実行しているディレクトリーになります。

(ルート)
  │
  ├── dir1
  │   ├── hoge.py
  │   └── dir2
  │        └─── fuga.py
  └── file.txt

上記のファイル構成の場合、「hoge.py」を実行している場合のカレントディレクトリは「dir1」、「fuga.py」を実行している場合は「dir2」となります。

相対パス

相対パスとは、あるファイルやディレクトリの場所を表す方法として、カレントディレクトリから辿って表記したパスのことです。

相対パスを書く際は、カレントディレクトリは「.」で表します。

また、現在の階層から1つ上の階層を「..」で表記することができます。

(ルート)
  │
  ├── dir1
  │   ├── hoge.py
  │   ├── file1.txt
  │   └── dir2
  │        ├── fuga.py
  │        ├── file2.txt
  │        └── dir3
  │             ├── piyo.py
  │             └── file3.txt
  │
  └── file_x.txt

上記のファイル構成の場合、「file2.txt」を表すパスは以下のようになります。

・ルートから見た場合(絶対パス)

「/dir1/dir2/file2.txt」

(先頭にルートを表す「/」をつけます。)

・カレントディレクトリが「dir1」の場合

「./dir2/file2.txt」

(先頭にカレントディレクトリを表す「.」をつけます。)

・カレントディレクトリが「dir2」の場合

「./file2.txt」

(先頭にカレントディレクトリを表す「.」をつけます。)

・カレントディレクトリが「dir3」の場合

「../file2.txt」

(dir2はdir3から見て1つ前の階層であるため「..」から書き始めます。)

Pythonでパスを書く

Pythonでは、パスは基本的に文字列として扱えます。

例として、コード内でパスを以下のように書きます。

path = "./aaa/bbb/ccc.txt"

パスを使って、テキストファイルの読み書きなどができるようになります。

path = "./aaa/bbb/ccc.txt"

text_file = open(path) # テキストファイルを読み取る

Windowsの場合、区切り文字の「/」はPython側で自動的に「\(バックスラッシュ)」に読み替えられるため、「/」のままパスを表記してかまいません。

バックスラッシュで区切ることはできますが、文字列中のバックスラッシュはエスケープ記号(特殊文字などを表記するための記号)として扱われるため注意が必要です。

バックスラッシュに注意してコードを書くと、以下のようになります。

windows_path = ".\\aaa\\bbb\\ccc.txt"  # バックスラッシュ2つで、バックスラッシュそのものを表す
windows_path = r".\aaa\bbb\ccc.txt" # raw文字列を使うと、特殊文字などはそのまま認識される。

os.pathライブラリにあるjoin()メソッドを使用すると、MacやWindowsなどの環境をPythonが認識して、適切なパスを生成してくれます。

import os

path = os.path.join('.', 'aaa', 'bbb', 'ccc.txt')
print(path)

(出力結果)

./aaa/bbb/ccc.txt

出力結果はOSなどの環境によって異なる可能性があります。

osライブラリを使ってパスを操作する

pythonの標準ライブラリであるosを使うと、パスに対して色々な操作が可能です。以下ではosライブラリでパスを扱う方法をいくつか紹介します。なお、コードの実行結果は環境によって異なります。

・カレントディレクトリを取得する「os.getcwd()」

import os

path = os.getcwd()
print(path)

(出力結果の例)

/Users/user_name/Documents/python_test

・相対パスから絶対パスを取得する「os.path.abspath()」

path = './file.txt'

abs_path = os.path.abspath(path)
print(abs_path)

(出力結果の例)

/Users/user_name/Documents/python_test/file.txt

・絶対パスか相対パスを判定する「os.path.isabs()」

path1 = './file.txt'
path2 = '/Users/user_name/Documents/python_test/file.txt'

print(os.path.isabs(path1))
print(os.path.isabs(path2))

(出力結果の例)

False
True

・パス末尾のファイル名を取得する「os.path.dirname()」

・パス末尾のファイル名より前の部分を取得する「os.path.dirname()」

・パスをdirname部分とbasename部分に分ける「os.path.split()」

path = '/Users/user_name/Documents/python_test/file.txt'

print('---dirname---')
base_name = os.path.basename(path)
print(base_name)

print('---basename---')
dir_name = os.path.dirname(path)
print(dir_name)

print('---split---')
dir_name, base_name = os.path.split(path)
print(dir_name, 'と', base_name)

(出力結果の例)

---dirname---
file.txt
---basename---
/Users/user_name/Documents/python_test
---split---
/Users/user_name/Documents/python_test/ と file.txt

・パスを拡張子とそれ以外に分ける「os.path.splitext()」

path = '/Users/user_name/Documents/python_test/file.txt'

root_path, ext = os.path.splitext(path)
print(root_path, 'と', ext)

(出力結果の例)

/Users/user_name/Documents/python_test/file と .txt

以上がパスの基本的な扱い方になります。

まとめ

・パスとは、ファイルシステムのファイルやディレクトリーの場所を表したもの。

・絶対パスとは、ファイルシステムのルート(先頭のディレクトリー)から辿ったパス。

・カレントディレクトリーとは、実行中のソフトウェアなどがファイルシステム中で現在位置として指し示しているディレクトリ

・相対パスとは、カレントディレクトリから辿って表記したパス

・Pythonでは、パスは基本的に文字列として扱えばよく、osライブラリでパスを自由に操作することができる

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL