iMind Developers Blog

iMind開発者ブログ

Pythonのpathlib.Pathでファイルパスの操作

概要

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, presents=True, exist_ok=True)

引数についているpresentsを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, 記事投稿