os.pathモジュールのdirname/basename/split関数と、pathlibモジュールのPath.parent/Path.name属性を使ってパスからディレクトリ名やファイル名を取得する方法を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
from os.path import dirname, basename
path = 'foo/bar/baz.txt'
dname = dirname(path)
fname = basename(path)
print(f'dir: {dname}, file: {fname}') # dir: foo/bar, file: baz.txt
from os.path import split
dname, fname = split(path)
print(f'dir: {dname}, file: {fname}') # dir: foo/bar, file: baz.txt
path = 'foo/bar/'
dname = dirname(path)
fname = basename(path)
print(f'dir: {dname}, file: {fname}') # dir: foo/bar, file:
dname, fname = split(path)
print(f'dir: {dname}, file: {fname}') # dir: foo/bar, file:
from pathlib import Path
path = Path('foo/bar/baz.txt')
print(f'dir: {path.parent}, file: {path.name}') # dir: foo/bar, file: baz.txt
path = Path('foo/bar/')
print(f'dir: {path.parent}, file: {path.name}') # dir: foo, file: bar
os.pathモジュールにはdirname関数とbasename関数がある。これらを使うと、パスのディレクトリ名とファイル名を取得できる。
これらの関数は共にパスを表す文字列(やPathオブジェクト)を引数に取り、dirname関数はそのディレクトリ名を返送し、basename関数はファイル名(に相当する部分)を返送する。
以下に例を示す。
from os.path import dirname, basename
path = 'foo/bar/baz.txt'
dname = dirname(path)
fname = basename(path)
print(f'dir: {dname}, file: {fname}') # dir: foo/bar, file: baz.txt
この例では「foo/bar/baz.txt」というパスに対してdirname関数とbasename関数を適用している。dirname関数により変数dnameにはディレクトリ名である「foo/bar」が、basename関数により変数fnameにはファイル名である「baz.txt」が代入されている。
ディレクトリ名かファイル名のいずれかが必要であれば、これらを使えばよい。両方が必要であれば、同じos.pathモジュールのsplit関数を使用する。この関数は与えられたパスをディレクトリ名とファイル名に分割したものをタプルとして返送する。
以下に例を示す。
from os.path import split
dname, fname = split(path)
print(f'dir: {dname}, file: {fname}') # dir: foo/bar, file: baz.txt
結果は上と同様だ。
注意する点としてはパスが区切り文字で終了する場合だ。この場合、パスはディレクトリ名しか含まれないと判断され、ファイル名は空となる。以下に例を示す。
path = 'foo/bar/'
dname = dirname(path)
fname = basename(path)
print(f'dir: {dname}, file: {fname}') # dir: foo/bar, file:
dname, fname = split(path)
print(f'dir: {dname}, file: {fname}') # dir: foo/bar, file:
この例ではパスは「foo/bar/」とパス区切り文字であるスラッシュ「/」で終わっている。そのため、ディレクトリ名だけでパスが構成されていると判断され、basename関数の戻り値とsplit関数の戻り値のファイル名部分が共に空文字となり、dirname関数の戻り値とsplit関数の戻り値のディレクトリ名部分が「foo/bar」となっている点に注目しよう。
Windowsではパス区切り文字がバックスラッシュになることを除けば同様の結果となる(スラッシュでも同様な扱いとなる)。
pathlibモジュールのPathクラス(の基底クラスであるPurePathクラス)にはparent属性とname属性がある。parent属性はパスを構成する要素の上位パス部分を表し、name属性はパスを構成する末尾の要素を表す。多くの場合、これは実質的にはパスのディレクトリ名とファイル名に相当する。
以下に例を示す。
from pathlib import Path
path = Path('foo/bar/baz.txt')
print(f'dir: {path.parent}, file: {path.name}') # dir: foo/bar, file: baz.txt
ここではパスは「foo/bar/baz.txt」を表しており、parent属性はその上位パス部分である「foo/bar」を、name属性が末尾の要素である「baz.txt」を表している。
ただし、Pathオブジェクトの生成時に指定するパス文字列をパス区切り文字で終わらせても、os.pathモジュールの3つの関数のような動作とはならない点には注意すること。以下に例を示す。
path = Path('foo/bar/')
print(f'dir: {path.parent}, file: {path.name}') # dir: foo, file: bar
この例では「foo/bar/」と文字列の末尾にスラッシュ「/」を含めても、parent属性は上位パス部分を表す「foo」を、name属性はパスの末尾である「bar」を示す。
Windowsではパス区切り文字がバックスラッシュとなる点を除けば同様な処理となる。ドライブ名などはパスの末尾要素とはならない点にも注意しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.