連載
» 2019年10月29日 05時00分 公開

[Python入門]pathlib.Pathクラスによるパス操作Python入門(2/3 ページ)

[かわさきしんじ,Deep Insider編集部]

具象パス

 既に述べたが、具象パスを扱うためのクラスにはPathクラス、PosixPathクラス、WindowsPathクラスの3つがあり、Pathクラスを使用して具象パスのインスタンスを生成することで、実行環境に合わせてPosixPathクラスかWindowsPathクラスのインスタンスが生成される。

 Pathクラスには以下のメソッドが定義されている(抜粋。先ほどと同じく、メソッド名の前の「Path.」は省略する)。

メソッド 説明 対応するos/os.pathモジュールの関数
cwd() クラスメソッド。カレントディレクトリを取得する os.getcwd関数
home() クラスメソッド。プログラムを実行しているユーザーのホームディレクトリを取得する  
exists() パスが存在するかどうかを確認する os.path.exists関数に対応
expanduser() パスに含まれる「~」をユーザーのホームディレクトリに展開したパスを取得する os.path.expanduser関数
is_dir() パスがディレクトリかどうかを調べる os.path.isdir関数
is_file() パスがファイルかどうかを調べる os.path.isfile関数
iterdir() パスがディレクトリの場合に、そのディレクトリに含まれているファイルやディレクトリを表すPathオブジェクトを反復するためのオブジェクトを取得する  
mkdir() パスが表しているディレクトリを作成する os.mkdir関数/os.makedirs関数
open() パスが表しているファイルをオープンする 組み込み関数openに対応
read_bytes() パスが表しているファイルの内容をバイト列として読み出す  
read_text() パスが表しているファイルの内容を文字列として(デコードし)読み出す  
rename(target) パスが表すファイルまたはディレクトリの名前をtargetに変更し、そのパスを表す新しいPathオブジェクトを返す(Python 3.8の場合。Python 3.7以前は戻り値を戻さない) os.path.rename関数
resolve() パスを絶対パスにした新しいPathオブジェクトを返す os.path.abspath関数
rmdir() そのパスが表すディレクトリを削除する。ディレクトリは空である必要がある os.rmdir関数
touch() パスが表すファイルを作成する、または既存のファイルのタイムスタンプを現在の日時に設定する  
unlink() パスが表すファイルを削除する os.remove関数
write_bytes() パスが表すファイルをバイナリモードでオープンして、引数として渡したデータを書き込む  
write_text() パスが表すファイルをテキストモードでオープンして、引数として渡した文字列を書き込む  
Pathクラスで定義されているメソッド(一部)

 PurePathクラスと同様に、前回紹介したos/os.pathモジュールの関数に対応するメソッドが幾つか存在している。また、ファイルに対する読み書きを行うメソッドもある。os/os.pathモジュールを完全に置き換えるものではないが、Pathクラスを使うことで、よりオブジェクト指向的な形式、つまり「パス.操作」「パス.属性」のような形でファイルやディレクトリの操作を行える。

 以下では前回と同様な操作をPathクラスを使って行うかを簡単に見ておこう。

カレントディレクトリの取得

 カレントディレクトリを取得するには、Pathクラスのクラスメソッドcwdを使用する。

print('cwd:', Path.cwd())

カレントディレクトリの取得

 実行結果を以下に示す。

実行結果 実行結果

指定したディレクトリの内容の取得

 os.listdir関数に相当するメソッドはないが、os.scandir関数のように、そのパスがディレクトリである場合に、そこに格納されているファイルやディレクトリを表すPathオブジェクトを反復するオブジェクトを返すiterdirメソッドがある。

 使用例を以下に示す。

mypath = Path('.')

for path in mypath.iterdir():
    print('path.name:', path.name)  # PurePath.name属性でパスのファイル名を取得

print('list comprehension:', [path for path in mypath.iterdir()])

iterdirメソッドによるカレントディレクトリの内容の取得

 iterdirメソッドは「ジェネレータ」と呼ばれるオブジェクトを返す。これは反復可能であるため、for文で反復してその内容を取得したり、リスト内包表記を使ってリスト化したりできる。

 実行結果を以下に示す。

実行結果 実行結果

 前回見たos.scandir関数はディレクトリ内の各エントリ(ファイルやディレクトリ)の属性なども含んだos.DirEntryクラスのオブジェクトを反復するジェネレータを返すものだが、こちらはあくまでもPathクラスのオブジェクトを反復するジェネレータを返すところが違う点だ。

ディレクトリの新規作成

 osモジュールではos.mkdir関数とos.makedirs関数を使ってディレクトリの新規作成を行える。Pathクラスではmkdirメソッドを使用する。

Path.mkdirメソッド

Path.mkdir(mode=0x777, parents=False, exist_ok=False)


 そのパスが表すディレクトリを作成する。modeにはファイルのアクセス許可(パーミッション)を表す3桁の8進数を指定する(本稿では説明を省略する)。parentsがFalseの場合、パスが表すディレクトリ階層の途中に存在しないディレクトリがあると例外が発生する(os.mkdir関数と同じ振る舞い)。これをTrueにすると、os.makedirs関数と同様に、足りないディレクトリも含めてディレクトリを作成するようになる。exist_okがFalseの場合(デフォルト)、パスが既存のディレクトリを表していると例外が発生する。これをTrueにすると、パスが既存のディレクトリを表しているときにも例外が発生しなくなる。ただし、パスが既存のファイルを表しているときには例外を送出する。

パラメーター 説明
mode ファイルのアクセス許可を指定する3桁の8進数値
parents ディレクトリ階層の途中に存在しないものがあったときに、それを作成するかどうか
exist_ok 既存のディレクトリを作成しようとしたときに、例外を発生させるかどうか
Path.mkdirメソッドのパラメーター


 以下に使用例を示す(実行結果は省略する)。

Path('xxx').mkdir()
Path('xxx/yyy/zzz').mkdir(parents=True# yyyを含めてxxx/yyy/zzzディレクトリを作成

Path.mkdir

ファイル/ディレクトリの削除

 osモジュールではファイルの削除には、os.remove関数またはos.unlink関数を使用し、ディレクトリの削除にはos.rmdir関数またはos.removedirs関数を使用する。Pathクラスではファイルの削除にはPath.unlinkメソッドを、ディレクトリの削除にはPath.rmdirメソッドを使用する。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。