初めに
pathlibモジュールで何ができるのか,使いそうなものを中心にまとめたものです.
なお,実行例を記載していますが,Macで実行しています.
pathlibについて
pathlibはファイル操作を行うpythonのモジュール.ver. 3.4以降.
osモジュールの上位互換.(公式ドキュメント)
扱うクラス:
PurePath: 文字列の操作のみ. I/O処理は無理.
Path: PurePathを継承してる,I/O処理も行う.
Windows,その他用(Macとか)のクラスがあって,それぞれ上二つを継承している.
Mac使ってるので,PosixPath()がよく出てくる.
基本Pathクラス使ってればOK.の適切なクラスのインスタンスを作ってくれる.
PurePathを使うのは,
1.UnixマシンでWindowsのPathを動かす(あるいはその逆)場合.
Unix上で動作するときに,Windows用のPathのインスタンスは作れない.PureWindowsPathなら可能.
2.OSにアクセスしたくない場合.
パスについての判定
存在する?
Path.exists()
returns: bool
ファイルかディレクトリが存在するならTrue,しないならFalse.
シンボリックリンクの場合,シンボリックリンクが既存のものを指しているかどうか.
Path('.').exists() > True Path('setup.py').exists() > False Path('/etc').exists() > True Path('nonexistentfile').exists() > False
ディレクトリ?
Path.is_dir()
returns: bool
パスがディレクトリかディレクトリのシンボリックリンクならTrue.
存在しないか,壊れたシンボリックリンクならFalse.
パーミッションエラーとかならエラー.
ファイル?
Path.is_file()
returns: bool
パスがファイルかファイルのシンボリックリンクならTrue.
存在しないか,壊れたシンボリックリンクならFalse.
パーミッションエラーとかならエラー.
絶対パス?
PurePath.
is_absolute
()
returns: bool
ルートとドライブとの両方が含まれる場合True.
使用例
PurePosixPath('/a/b').is_absolute() > True PurePosixPath('a/b').is_absolute() > False
このパスは相対パスにある?
PurePath.is_relative_to(*other)
ver. 3.9で追加.
returns: bool
使用例
p = PurePath('/etc/passwd') p.is_relative_to('/etc') > True p.is_relative_to('/usr') > False
pathをつなげる
メソッドで
PurePath.joinpath(*other)
returns: Path
使用例
p = Path('.')
p.joinpath('a', 'b', 'c')
> PosixPath('a/b/c')
演算子で
演算子 / を用いて,文字列・Pathオブジェクトと繋げられる.
returns: bool
使用例
p = Path('.')
pd = Path('d') p / 'a' / 'b' / 'c' / pd > PosixPath('a/b/c/d')
ディレクトリ関係
ディレクトリ作成
Path.mkdir(mode=511, parents=False, exist_ok=False)
ver. 3.5で引数追加.
mode:
プロセスの umask 値と組み合わせてファイルのモードとアクセスフラグを決定します。
parents:
True: 必要なら親ディレクトリを作成する.
アクセス制限はデフォルト値(=?)
mode は使用されない (POSIX の mkdir -p コマンドを真似ている).
False: 親ディレクトリがないとFileNotFoundError
exist_ok:
False: 対象のディレクトリがすでに存在すると FileExistsError.
True: ディレクトリが存在してもエラーなし.ディレクトリでない場合はFileExistsError.
(POSIXのmkdir -pコマンドの挙動と同じ)
return: None
ディレクトリ削除
Path.rmdir()
ディレクトリを削除.
ディレクトリは空でないとダメ.
return: None
ディレクト内のものをイテレートする
Path.iterdir()
return: generator
ジェネレータを返却.
順番はランダム?なのでsorted()するといいかも.
使用例
paths = pathlib.Path(path) for p in paths.iterdir(): print(p)
> test.py __pycache__ .a
特定のディレクトリ・ファイルをglobする
Path.glob(pattern)
ディレクトリ,サブディレクトリを再帰的にglobできる.
サイズの大きいディレクトリで’**’をすると時間かかるかも.
pattern: str
正規表現とは違う.
Unixのシェル形式のワイルドカードに対応するfnmatch (下表).
fnmatchに加えて再帰的にglobすることができる”**”が追加されてる.
Pattern | 意味 |
---|---|
* | すべてにマッチ |
? | 任意の一文字にマッチ |
[seq] | seq にある任意の文字にマッチ |
[!seq] | seq にない任意の文字にマッチ |
return: generator
文字列に一致するものファイル,ディレクトリを集めたジェネレータを返却.
??順番は何順
sorted()すると良い.
使用例
p = Path('.') sorted(p.glob('*')) > [PosixPath('.a'), PosixPat('test.py'), PosixPath('__pycache__'), PosixPath('test')] # そのディレクト内のみ sorted(p.glob('.*')) > [PosixPath('.a')] sorted(p.glob('**')) > [再帰的にディレクトリのPosixPathオブジェクト] sorted(p.glob('**/*')) > [再帰的にディレクトリ・ファイルのPosixPathオブジェクト] sorted(p.glob('**/*.py') > [再帰的にpythonファイルのPosixPathオブジェクト]
再帰的に特定のファイル・フォルダをglobする
Path.rglob(patern)
Path.glob()で”**/”をpatternにつけたものと同値.
使用例
sorted(Path().rglob("*.py")) > [PosixPath('build/lib/pathlib.py'), PosixPath('docs/conf.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
パスを構成する要素の取得
各構成要素
PurePath.parts
type: tuple
使用例
p = Path('/usr/bin/python3')
p.parts
> ('/', 'usr', 'bin', 'python3')
一つ上位のパス
PurePath.parent
純粋な文字の操作.
上位パスが書かれてない場合,そのまま返却.
任意のファイルを操作する場合,シンボリックリンクや”..”の除去のために,Path.resolve()
を呼ぶべき.
type: Path
使用例
p = Path('/a/b/c/d') p.parent
> pathlib.PosixPath('/a/b/c')
# 上位パスが書かれてない場合p = Path('/') p.parent
> pathlib.PosixPath('/')
p = Path('.') p.parent
> pathlib.PosixPath('.')
# ".."は特別な処理はされない.ただの文字列の処理.p = Path('a/../b') p.parent
> pathlib.PosixPath('a/..')
上位パスのシーケンス
PurePath.parents
ver. 3.10からスライス・マイナス要素もサポート.
type: _PathParents
イミュータブルなシーケンス.
[親,親の親,親の親の親,親の…]
使用例
p = Path('a/b/c.py')
list(p.parents)
> [PosixPath('a/b'), PosixPath('a'), PosixPath('.')]
p.parents[0]
> PosixPath('a/b')
最後にある要素
“ディレクトリorファイル名.拡張子”
PurePath.name
return: str
パスの最後の文字列を返却.
UNCドライブ名は考慮されない(Windowsの話?)
使用例
PurePosixPath('my/library/setup.py').name
> 'setup.py'
PurePosixPath('my/library/').name
> 'library'
“ディレクトリorファイル名”(拡張子なし)
PurePath.stem
type: str
パスの最後の要素から拡張子(一つ分)取り除いた文字列.
使用例
PurePosixPath('my/library.tar').stem
> 'library'
PurePosixPath('my/library.tar.gz').stem
> 'library.tar'
PurePosixPath('my/library').stem
> 'library'
PurePosixPath('my/.config.txt').stem
> '.config'
“.拡張子”
PurePath.suffix
return: str
パスの最後の要素の拡張子(一つ分)の文字列.
拡張子なかったら空文字.
使用例
PurePosixPath('my/library/setup.py').suffix > '.py'
PurePosixPath('my/library.tar.gz').suffix > '.gz'
PurePosixPath('my/library').suffix > ''
“.拡張子”リスト
PurePath.suffixes
return: list
拡張子のリストを返却.
使用例
PurePosixPath('my/library.tar.gz').suffixes
> ['.tar', '.gz']
PurePosixPath('my/library').suffixes
> []
“ディレクトリorファイル名.拡張子”を入れ替える
PurePath.with_name(name)
name: str
引数nameが空文字だとInvalid name..
return: Path
最後の要素を入れ替えたPathオブジェクトを返却.
使用例
p = Path('/Downloads/pathlib.tar.gz') p.with_name('.set') > PosixPath('/Downloads/.set') p = Path('a/b') # 'a/b/'でも同じになる p.with_name('.set') > PosixPath('a/.set') p = Path('/Downloads/pathlib.tar.gz') p.with_name('') > ValueError: Invalid name ''
“ディレクトリorファイル名”を入れ替える(拡張子以外)
PurePath.with_stem(stem)
ver. 3.9 で追加.
stem:
最後の要素に拡張子ないものに空文字を渡すとValueError.
return: Path
使用例
p = Path('/Downloads/pathlib.tar.gz') p.with_stem('.set') > PosixPath('/Downloads/.set.gz') p = Path('/Downloads/pathlib.tar.gz') p.with_stem('') > PosixPath('/Downloads/.gz') p = Path('a/b') # 'a/b/'でも同じ p.with_stem('.set') > PosixPath('a/.set') p = Path('a/b') p.with_stem('') > ValueError: Invalid name ''
“.拡張子”を入れ替える
PurePath.with_suffix(suffix)
suffix:
空文字渡したらなくなる.
元の方についてなかったらつける.
return: Path
使用例
p = Path('/Downloads/pathlib.tar.gz') p.with_suffix('.set') > PosixPath('/Downloads/pathlib.tar.set') p = Path('/Downloads/pathlib.tar.gz') p.with_suffix('') > PosixPath('/Downloads/pathlib.tar') p = Path('a/b') # 'a/b/'でも同じ p.with_suffix('.set') > PosixPath('a/b.set')
ディレクトリ・ファイル操作
ディレクトリ・ファイル名の変更
Path.rename(target)
ファイル名をtargetに変更する.
Unix では変更後の名前のものが存在する場合,パーミッションがあれば暗黙に置換.
ファイルが存在しない場合,FileNotFoundError.
target: str or Path
絶対パスか相対パスで.
相対パスならrenameするオブジェクトのパスではなく,現在の作業ディレクトリからの相対パス.
return: Path
新たな名前を指すパスのインスタンスを返却.返却はver. 3.8から
使用例
p = Path('foo')
# ファイル作成p.touch()
target = Path('bar') p.rename(target) > PosixPath('bar')
ディレクトリ・ファイルの置き換え
Path.replace(target)
ファイル名をtargetに変更(移動)する.
Unix では変更後の名前のものが存在する場合,無条件に置換.(Path.rename()との違いはここだけ?)
ファイルが存在しない場合,FileNotFoundError.
target: str or Path
絶対パスか相対パスで.
相対パスならrenameするオブジェクトのパスではなく,現在の作業ディレクトリからの相対パス.
return:
新たな名前を指すパスのインスタンスを返却.(返却はver. 3.8から)
ファイルを開く
Path.open(mode='r', buffering=- 1, encoding=None, errors=None, newline=None)
p = Path('setup.py') with p.open() as f: f.readline() > '#!/usr/bin/env python3\n'
その他(上記にないもの)
ドライブ文字 PurePath.drive
ルート文字列 PurePath.root
ドライブとルートの結合 PurePath.anchor
/を使ったパスを表す文字列 PurePath.as_posix()
fileURLで表した文字列 PurePath.as_uri()
予約されてるか(Windows) PurePath.is_reserved()
glob形式パターンと一致するか PurePath.match(pattern)
otherパスから現在のパスへの相対パス PurePath.relative_to(*other)
現在のディレクトリを表す新しいPathオブジェクト classmethod Path.cwd()
ホームディレクトリを表すPathオブジェクト classmethod Path.home()
パスに関する情報 Path.stat(*, follow_symlinds=True)
ファイルのモード,パーミッション変更 Path.chmod(mode, *, follow_symlinks=True)
ホームディレクトリのパス Path.expanduser()
ファイルを所有するグループ名
Path.group()
マウントかどうか
Path.is_mount()
シンボリックリンクかどうか
Path.is_symlink()
FIFOかどうか
Path.is_fifo()
ブロックデバイスかどうか
Path.is_block_device()
キャラクターデバイスかどうか
Path.is_char_device()
シンボリックのchmod ver
Path.lchmod(mode)
フィイルの所有者のユーザ名
Path.owner()
バイナリオブジェクトで返却
Path.read_bytes()
文字列としてデコード
Path.read_text(encoding=None, errors=None)
シンボリックリンクが指すパスを返却
Path.readlink()
パスを絶対パスにする
Path.resolve(strict=False)
同じファイル(Pathオブジェクトまたは文字列)かどうか
Path.samefile(other_path)
シンボリックリンクの作成
Path.symlink_to(target, target_is_directory=False)
ハードリンクにする
Path.symlink_to(target, target_is_directory=False)
Path.link_to(target) (非推奨)
ファイル作成
Path.touch(mode=438, exist_ok=True)
ファイル削除
Path.unlink(missing_ok=Fasle)
ファイル書き込み(バイナリモード)
Path.write_bytes(data)
ファイル書き込み(テキストモード)
Path.write_text(data, encoding=None, errors=None, newline=None)
コメント