Loading [MathJax]/extensions/tex2jax.js

pathlib

pathlib

初めに

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 にない任意の文字にマッチ
出典:https://docs.python.org/ja/3/library/fnmatch.html#module-fnmatch

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)

コメント

タイトルとURLをコピーしました