できる 仕事がはかどるPython自動処理 全部入り。 (「できる全部入り。」シリーズ)
目次
- 目次
- はじめに
- パスオブジェクトの作成
- パスの連結(join)
- パスの存在確認やファイルかディレクトリであるかの確認
- 絶対パスの取得
- パスの文字列を取得
- パスの親ディレクトリを取得
- ファイルの様々な情報を取得
- ファイルのデータの読み込み
- ファイルのデータの書き込み
- パスの一部のみを変更したパスを作る
- パスの先のファイルの情報を取得
- パスの先のファイルの削除
- ディレクトリの作成
- ディレクトリの削除
- あるディレクトリ内のある拡張子のファイルのパスのリストを取得
- あるディレクトリ以下のある拡張子のファイルのパスリストを再帰的に取得
- あるディレクトリ以下の、拡張子毎の数を数える
- 参考資料
- MyEnigma Supporters
はじめに
Pythonでファイルやパス関連の操作するとき、
古くからos.pathモジュールが使われてきましたが、
Python3.4から導入されたpathlibモジュールは、
より自然にファイルやパス操作を実施できるライブラリです。
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()
ファイルのデータの書き込み
# バイナリデータの書き込み path.write_bytes() # 文字列の書き込み path.write_text() # 追記したい場合はmode="a"でopenしないといけない with path.open(mode="a") as file: file.write("hoge")
パスの一部のみを変更したパスを作る
名前や拡張子だけ変えて、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()
ディレクトリの作成
# ディレクトリを作る(parents=Trueだと間のディレクトリが存在しない場合は作成する) new_dir.mkdir(parents=True)
ディレクトリの削除
# ディレクトリの中は空である必要があります
path.rmdir()
あるディレクトリ内のある拡張子のファイルのパスのリストを取得
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("*"))
参考資料
できる 仕事がはかどるPython自動処理 全部入り。 (「できる全部入り。」シリーズ)
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。