MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Pythonでのファイルやパス操作標準ライブラリpathlib逆引きメモ


できる 仕事がはかどるPython自動処理 全部入り。 (「できる全部入り。」シリーズ)

目次

はじめに

Pythonでファイルやパス関連の操作するとき、

古くからos.pathモジュールが使われてきましたが、

Python3.4から導入されたpathlibモジュールは、

より自然にファイルやパス操作を実施できるライブラリです。

docs.python.org

 

os.pathモジュールでは、すべてのパスを文字列として表現するため、

コードが冗長になりやすかったですが、

pathlibでは、パスをオブジェクトとして取り扱うため

シンプルにやりたいことを実現することができます。

 

今回の記事では、

pathlibを使ったよくやるファイルやパス操作の逆引きメモを残しておきます。

 

パスオブジェクトの作成

from pathlib import Path

# 文字列からのパスオブジェクトの作成
path1 = Path("/home/test.txt")

# 現在のディレクトリのパスオブジェクト作成
path2 = Path.cwd()

# ホームディレクトリのパスオブジェクト作成
path3 = Path.home()

 

パスの連結(join)

data_dir = Path(".") / "data"
csv_file = data_dir / "file.csv"

 

パスの存在確認やファイルかディレクトリであるかの確認

# 存在確認
path.exists()

# ファイルかどうか
path.is_file()

# ディレクトリかどうか
path.is_dir()

 

絶対パスの取得

# シンボリックリンクは解決しない
path.absolute()

# シンボリックリンクも解決する
path.resolve()

 

パスの文字列を取得

str(Path.home())

 

パスの親ディレクトリを取得

path.parent

 

ファイルの様々な情報を取得

# ファイル名
path.name

# 拡張子以外のファイル名
path.stem

# 拡張子
path.suffix

 

ファイルのデータの読み込み

# バイナリデータ読み込み
path.read_bytes()

# 文字列読み込み
path.read_text()

docs.python.org

docs.python.org

 

ファイルのデータの書き込み

# バイナリデータの書き込み
path.write_bytes()

# 文字列の書き込み
path.write_text()

# 追記したい場合はmode="a"でopenしないといけない
with path.open(mode="a") as file:
    file.write("hoge")

docs.python.org

docs.python.org    

パスの一部のみを変更したパスを作る

名前や拡張子だけ変えて、renameするのに便利です。

# ファイル名を変更
path.rename(path.stem("new"))

# 拡張子を変更
path.rename(path.suffix("csv"))

パスの先のファイルの情報を取得

# ファイルサイズ取得 (バイト数)
path.stat().st_size

# 最終変更時間を取得
from datetime import datetime

modified_timestamp = renamed_md.stat().st_mtime
datetime.fromtimestamp(modified_timestamp)

 

パスの先のファイルの削除

path.unlink()

docs.python.org

 

ディレクトリの作成

# ディレクトリを作る(parents=Trueだと間のディレクトリが存在しない場合は作成する)
new_dir.mkdir(parents=True)

docs.python.org

 

ディレクトリの削除

# ディレクトリの中は空である必要があります
path.rmdir()

docs.python.org

 

あるディレクトリ内のある拡張子のファイルのパスのリストを取得

files = list(dir_path.glob("*.txt")) # 再帰的には検索しない

あるディレクトリ以下のある拡張子のファイルのパスリストを再帰的に取得

files = list(dir_path.rglob("*.txt"))

あるディレクトリ以下の、拡張子毎の数を数える

from collections import Counter

Counter(p.suffix for p in (Path.home()).rglob("*"))

 

参考資料

towardsdatascience.com


できる 仕事がはかどるPython自動処理 全部入り。 (「できる全部入り。」シリーズ)

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com