[Python入門]pathlib.Pathクラスによるパス操作:Python入門(2/3 ページ)
pathlibモジュールが提供するPathクラス、PurePathクラスなどを使って、ファイルやディレクトリを扱う方法を紹介する。
具象パス
既に述べたが、具象パスを扱うためのクラスには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メソッドは「ジェネレータ」と呼ばれるオブジェクトを返す。これは反復可能であるため、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ディレクトリを作成
ファイル/ディレクトリの削除
osモジュールではファイルの削除には、os.remove関数またはos.unlink関数を使用し、ディレクトリの削除にはos.rmdir関数またはos.removedirs関数を使用する。Pathクラスではファイルの削除にはPath.unlinkメソッドを、ディレクトリの削除にはPath.rmdirメソッドを使用する。
Copyright© Digital Advantage Corp. All Rights Reserved.