け日記

最近はPythonでいろいろやってます

Python: ファイルパスをオブジェクトっぽく操作するpathlib

Pythonでのファイル操作は os + glob の組み合わせなどでどうにかすることが多いですが、標準モジュールのpathlibを使うとサクッと実装できることもあります。

pathlib --- オブジェクト指向のファイルシステムパス — Python 3.7.5rc1 ドキュメント

osモジュールと異なっている点は、ファイルパスを文字列ではなくオブジェクトっぽく扱うことができます。

  • Linux / MacとWindowsで使うクラスが異なっており、今回は前者で試しています
    • Linux / MacはPosixPath, WindowsはWindowsPath
    • いずれもPathとPurePathを継承しているので、使い方は大きくは異ならないですが、/\などの違いがあります

ディレクトリ以下の.txtファイルを列挙してファイルオープン・リネームする、といった処理は以下のような実装となります。

PosixPathオブジェクトのメソッドを呼び出すことで、簡単・簡潔に実装できることがわかります。

from pathlib import Path

# ディレクトリを指定
dir_path = Path("./sample")
print("type:", type(dir_path))  # <class 'pathlib.PosixPath'>

# ディレクトリかどうかチェック
print("is dir?:", dir_path.is_dir())  # True

# ディレクトリ下の.txtファイル一覧への処理
# 条件を指定しない場合は、dir_path.iterdir()
for p in dir_path.glob("*.txt"):
    # パス
    print("path:", p)  # sample/file1.txt
    
    # ファイル名だけ
    print("file name:", p.name)  # file1.txt
    
    # 拡張子と分離
    print(p.stem, "+", p.suffix)  # file1 + .txt
    
    # ファイルオープン
    # p.open('w').write("hoge") で書き込むこともできる
    txt = p.open().read()
    print(txt)  # hello, world.
    
    # リネーム先のファイルパス (/演算子でパスを切れる)
    new_path = Path(dir_path / (p.stem + "_new" + p.suffix))
    
    # 存在しないことを確認
    print("is_exists?:", new_path.exists())  # False
    
    # リネーム
    p.rename(new_path)
    print("is_exists?:", new_path.exists())  # True