Python os.pathパス名の操作
Python で,パス名(ファイルとディレクトリーの場所)を操作を操作するための便利なライブラリー os.path の使い方について説明します.私はプログラムを書くときには,この os.path を必ずと言って良いほど使います.とても便利です.
目次
はじめに
インターフェースを伴ったプログラムでは,パス名の操作が必須です.どこからファイルを読み出すのか,どこに書きだすのかをプログラムで明示しなくてはなりません.通常,この作業はかなり面倒です.C言語などのプログラミング言語ではとても嫌になる作業です.その点,Python には,パス名の操作のためのライブラリー「os.path」があり,プログラミングの作業が楽になります.os.path を使うと,パスに関わる文字列の作成がとても簡単にできます.
以具体なプログラムで,os.path が便利なことを示します.相対パスと絶対パスの文字列を作っています.
os.path を使ったプログラム例 |
実行結果 |
001 import os.path
002
003 pwd = './'
004 file = 'hoge.txt'
005
006 path = os.path.join(pwd, file)
007 abs_path = os.path.abspath(path)
008
009 print(path)
010 print(abs_path)
|
./hoge.txt
/home/yamamoto/www_server/www/comp/Python/library/os.path/example/concrete/hoge.txt
|
このプログラム中の006行で相対パス(../hoge.txt)を,007行で絶対パスの文字列が得られます.この文字列を使えば,path の操作が可能なります.
os.path の関数(コマンド)
os.path の関数(コマンド)を示します.
パスの一部を取り出す
以下に示す関数を使うと,パスを構成する文字列の一部を取り出すことができます.文字列は,これらの関数の戻り値で与えられます.私は,得られた文字列を文字列関数やメソッド,os.paht.join(),演算子(+など)を使い,任意のパスを作成することが多々あります.
コマンド |
動作 |
os.path.dirname(path) |
ディレクトリー名を返す(使用例). |
os.path.basename(path) |
パスの末尾のファイル名部分を返す. |
os.path.relpath(path, start=os.curdir) |
カレントディレクトリあるいはオプションの start ディレクトリからの path への相対パスを返す(使用例). |
os.path.commonpath(paths) |
パスのシーケンスの共通パスを返えす(使用例). |
os.path.commonprefix(list) |
パスの先頭から共通部分(文字比較)を返えす(使用例). |
os.path.split(path) |
path を (head, tail) に分割.tail はパス名の構成要素の末尾(通常はファイル名)で,head はそれより前の部分です(使用例). |
os.path.splitdrive(path) |
path を (drive, tail) のペアに分割します(使用例). |
os.path.splitext(path) |
path を (root, ext) のペアに分割します.ext は拡張子で,root はそれ以前です(使用例). |
パス指定方法の変更
以下に示す関数を使うと,パスの指定方法の変更することができます.パスの指定には,相対パスと絶対パスしていが有ります.また,環境変数を使うこともできます.シンボリックリンクを使った指定も有ります.これらを変換 (相対パスから絶対パスに) したり,通常の文字列に展開するための関数です.
コマンド |
動作 |
os.path.abspath(path) |
絶対パスを返す. |
os.path.expanduser(path) |
ホームディレクトリーを表す — Unix:「~」,Windows:「user」— を絶対パスに置き換えて返す(使用例). |
os.path.expandvars(path) |
path に含まれる環境変数を展開して返す.Unix では,path 中の $name や ${name} が展開されます.これに加えて,Windows では,%name% も展開されます(使用例). |
os.path.realpath(path) |
path のシンボリックリンクを正規化したパスに変換し,それを返す. |
パス文字列の操作
次の関数は,パスの文字列の操作を行います.
コマンド |
動作 |
os.path.join(path, *paths) |
複数のパスを結合する. |
os.path.normpath(path) |
不要な区切り文字や上位ディレクトリーへの記号「..」を削除します(使用例). |
os.path.normcase(path) |
Unix 系は変化なし.大文字小文字を区別しない処理系では大文字は小文字に変換されます.Windows の場合はスラッシュをバックスラッシュに変換します(使用例). |
ファイルの検査(戻り値: True/False)
以下はパスを検査する関数です.戻り値はブール値 (True or False) です.
コマンド |
動作 |
os.path.exists(path) |
path が有る場合は True を返えす. |
os.path.isfile(path) |
path が通常のファイルとして存在するならば,True を返す. |
os.path.isdir(path) |
path がディレクトリーとして存在するならば,True を返す. |
os.path.samefile(path1, path2) |
二つのパス(path1, path2)が同じファイル/ディレクトリーを指している場合,True を返す. |
os.path.lexists(path) |
path がある場合,True を返す.壊れたシンボリックリンクについても,True になる.os.lstat() がない環境では exists() と同じ. |
os.path.isabs(path) |
path が絶対パスならば,True を返す. |
os.path.islink(path) |
path がシンボリックリンクとして存在するならば,True を返す. |
os.path.ismount(path) |
path がマウントポイントならば,True を返す. |
os.path.sameopenfile(fp1, fp2) |
二つのファイル記述子(fd1, fd2)が同じファイルをオープンしている場合,True を返す. |
os.path.samestat(stat1, stat2) |
os.fstat() や os.lstat(),os.stat() の返り値 (stat1, stat2) が同じファイルを参照していれば True を返す. |
パスの情報を返す
以下の関数は,パスに関わる情報を返します.
コマンド |
動作 |
os.path.getatime(path) |
最後にアクセスした時刻を,エポック (Unix系:1970/1/1 00:00:00) からの経過時間[sec]で返す. |
os.path.getmtime(path) |
最後に更新した時刻を,エポック (Unix系:1970/1/1 00:00:00) からの経過時間[sec]で返す. |
os.path.getctime(path) |
Unix: メタデータの更新時刻,あるいは Windows: path の作成時刻を,エポック (Unix系:1970/1/1 00:00:00) からの経過時間[sec]で返す. |
os.path.getsize(path) |
path のファイルサイズ[バイト]を返す. |
応用
実際のプログラムの実装で有用なテクニックを示します.
- os.path.normpath(os.path.join(path, *path)
- 相対パス(../)がある場合に,(../)が消されたパスを返します(使用例).最初のパスの「../」は消すことはできません.
- name, ext = os.path.splitext(os.path.basename(path))
- ファイル名と拡張子を取り出します.
- path = os.path.join(path_A, path_B, path_C).replace('\\', '/')
- こうすると,Windows でも,パスの区切りをスラッシュ '/' にすることができる.
ページ作成情報
参考資料
更新履歴
|