概要
Python3.4から導入されたpathlibでのファイルやパスの操作について確認する。
バージョン情報
- Python 3.7.4
サンプルデータ
下記のようなパス構成に対して操作を行う。
├── bar.txt ├── foo.txt └── hoge ├── fuga.txt └── gaz.txt
ファイルの存在チェック
osを使った場合。
import os os.path.exists('foo.txt') #=> True
Pathを使った場合。
from pathlib import Path path = Path('foo.txt') path.exists() #=> True
file or directory?
指定したパスがファイルかディレクトリか確認する。
os版。
os.path.isfile('foo.txt') #=> True os.path.isdir('foo.txt') #=> False
pathlib版。
path = Path('foo.txt') path.is_file() #=> True path.is_dir() #=> False
symlinkのチェックもできる。
path.is_symlink()
#=> False
ファイルのtouch
path.touch()
フォルダの生成と削除
os版
os.mkdir('dir', 0o755) os.rmdir('dir')
pathlib版
dir_path = Path('dir') dir_path.mkdir(mode=0o755, parents=True, exist_ok=True)
引数についているparentsをTrueにすると mkdir -p foo/bar/baz のように複数の階層のディレクトリを一発で作成できる(デフォルトはFalse)。
exists_okをTrueにすると既にディレクトリがある場合でもエラーにならない。 if os.path.exists とか書かなくて済む。
配下のファイルやフォルダを取得する
osだと下記のように書くやつ。
for name in os.listdir('.'): print(name) #=> bar.txt #=> foo.txt #=> hoge
pathlib.Pathを利用した場合。
path = Path('.') for child in path.iterdir(): print(child) #=> bar.txt #=> foo.txt #=> hoge
listdirはファイル名を文字列で返すが、Path.iterdirはPathを返す。
ファイルの読込み
read_bytesやread_textでファイルの中身を読み込むことができる。
# テキストで読む text = path.read_text() # bytesで読む b = path.read_bytes()
Pathからopenすることも可能。
with path.open('rt') as f: print(f.read())
パスの合成
os版
os.path.join('hoge', 'fuga') #=> hoge/fuga
pathlib版
dir_path = Path('hoge') dir_path / 'fuga' #=> PosixPath('hoge/fuga')
スラッシュ1つでWindowsやLinuxを意識せずにパスを合成できるので便利。
親ディレクトリの取得
1つ上のディレクトリを取得
example_path = Path('aaa/bbb/ccc/ddd') example_path.parent #=> PosixPath('aaa/bbb/ccc')
parentsを使うといくつ上まで戻るか数値で指定できる。
example_path = Path('aaa/bbb/ccc/ddd') # 1つ上 example_path.parents[0] #=> PosixPath('aaa/bbb/ccc') # 2つ上 example_path.parents[1] #=> PosixPath('aaa/bbb') # 3つ上 example_path.parents[2] #=> PosixPath('aaa') # 4つ上 example_path.parents[3] #=> PosixPath('.') # 5つ上(存在しない)を指定するとエラー example_path.parents[4] #=> IndexError: 4
改定履歴
Author: Masato Watanabe, Date: 2019-11-07, 記事投稿