HOWTO · Python

Python でパスからディレクトリを取得

このチュートリアルでは、Python でファイルパスの一部を抽出する方法を示します。

このページの内容

ファイルパスから親ディレクトリを取得するには、そのパスを os.path.dirname() に渡します。オブジェクト指向の方法を使う場合は、pathlib の Path(file_path).parent を利用できます。どちらもファイルを含むディレクトリを返し、プロセスの現在の作業ディレクトリは返しません。

例では、結果を読み取りやすくするためにスラッシュ区切りのパスを使っています。Pythonのパス関数は、実行中のOSに応じてパスを解釈します。複数の値からパスを組み立てるときは、区切り文字を手作業で挿入せず、os.path.join() または pathlib を使いましょう。

パス区切り文字を理解する

パスでは、ディレクトリ名と最後の要素が、プラットフォーム固有の区切り文字で分けられます。POSIX系システムでは通常 / が使われます。Windowsのパスでは通常 \ が使われますが、多くのパス操作で / も使用できます。os.sep は、現在のプラットフォームで使われる区切り文字を示します。通常のパス操作では、自分で区切り文字ごとに処理を分けるのではなく、パスを os.path に渡すか、pathlib を使います。

os.path.basename でファイル名を取得する

os.path.basename() は、パスの最後の要素を返します。ファイルパスの場合、通常は拡張子を含むファイル名が返され、ディレクトリは返されません。ファイルパスから最後のディレクトリ名を取得するには、まず os.path.dirname() で親ディレクトリを取り出し、その結果を os.path.basename() に渡します。

import os

file_path = "/home/user/documents/report.txt"
filename = os.path.basename(file_path)
parent_directory = os.path.dirname(file_path)
last_directory = os.path.basename(parent_directory)

print(filename)
print(last_directory)
report.txt
documents

os.path.splitext でファイル名と拡張子を分ける

os.path.splitext() は、パスの最後の要素から拡張子を分離し、(root, ext) のペアを返します。拡張子は空文字列か、ピリオドで始まる文字列です。この関数はディレクトリを返しません。ディレクトリが必要な場合は os.path.dirname() を使います。

import os

file_path = "/home/user/documents/report.txt"
root, extension = os.path.splitext(file_path)

directory = os.path.dirname(file_path)
print(root)
print(extension)
print(directory)
/home/user/documents/report
.txt
/home/user/documents

archive.tar.gz のようなファイル名では、splitext() が分離するのは最後のサフィックス .gz だけです。返されるルートには archive.tar が残ります。拡張子の扱いは、アプリケーションが想定する命名規則に合わせてください。

os.path.dirname でファイルパスからディレクトリを取得する

os.path.dirname() は、パスのディレクトリ部分を文字列として返します。すでにパス文字列があり、その最後の要素の親ディレクトリを取得したい場合に直接使える方法です。リンク先として提供されているAPIページは英語版のみです。

import os

file_path = "/home/user/documents/report.txt"
directory = os.path.dirname(file_path)

print(directory)
/home/user/documents

入力と関数呼び出しでは、同じ変数を使います。この関数が処理するのはパス文字列であり、ファイルやディレクトリが存在するかどうかは確認しません。ディレクトリの作成、一覧表示、内容の確認が必要な場合は、それぞれに適したファイルシステム操作を別途使います。

pathlib で親ディレクトリを取得する

pathlib は、パス操作に使える Path オブジェクトを提供します。Path.parent 属性は、親パスを別の Path オブジェクトとして返します。パス操作を連鎖させるときや、パス形式の値を受け取るAPIに渡すときに便利です。

from pathlib import Path

file_path = Path("/home/user/documents/report.txt")
parent_directory = file_path.parent

print(parent_directory)
print(file_path.parts)
/home/user/documents
('/', 'home', 'user', 'documents', 'report.txt')

Path.parts は、パスの各要素を含むタプルです。関数ではなく属性です。親ディレクトリには Path.parent を使い、各要素を調べたり、インデックスで参照したりする場合は parts を使います。

相対パスを解決し、現在の作業ディレクトリを取得する

相対パスは、プロセスの現在の作業ディレクトリを基準に解釈されます。os.path.abspath() は、その作業ディレクトリを基準として相対パスを絶対パスに変換します。変換後のパスが含まれるディレクトリを取得するには、そのパスを os.path.dirname() に渡します。リンク先として提供されているAPIページは英語版のみです。

import os

relative_path = "documents/report.txt"
absolute_path = os.path.abspath(relative_path)
file_directory = os.path.dirname(absolute_path)

print(absolute_path)
print(file_directory)
/work/documents/report.txt
/work/documents

Path.cwd() は現在の作業ディレクトリを Path オブジェクトとして返し、os.getcwd() は文字列として返します。どちらもプロセスの作業ディレクトリを示すもので、Pythonスクリプトが置かれたディレクトリとは異なる場合があります。相対パスの起点を確認するにはこれらを使います。スクリプトが置かれたディレクトリが必要な場合は、スクリプト内で Path(__file__).parent を使います。

import os
from pathlib import Path

print(Path.cwd())
print(os.getcwd())
/work
/work