Python講座 / pathlibでファイルとフォルダーのパスを扱う
pathlib.Pathはファイルシステムのパスを表し、OSの規則に従ってパスを結合できます。相対パスの起点は現在の作業フォルダーであり、スクリプトを置いた場所と一致するとは限りません。
区切り文字を手作業で連結しない
Path("data") / "expenses.csv"なら、Windowsのバックスラッシュなどを直接挿入せずに構成要素を結合できます。Pathオブジェクトを作っただけでは、ファイルやフォルダーは作成されません。
Path.cwd()は作業フォルダーを返します。通常のスクリプトではPath(__file__).resolve().parentでスクリプトの場所を取得できますが、対話環境には__file__がない場合もあります。出力の起点をプログラムの仕様として選び、両者が同じだと決めつけないでください。
ファイル書き込みとコピー先の範囲は、withと文字コードを指定してテキストファイルを読み書きするで扱う規則とつながります。
実習用のファイルを作って調べる
新しい実習フォルダーでpaths.pyへ全体コードを保存し、仮想環境でpython paths.pyを実行します。lab-data/expenses.csvへ書き込み、すでにあれば内容を置き換える例です。必要なファイルがある場所では実行しません。
from pathlib import Path
base = Path("lab-data")
base.mkdir(exist_ok=True)
path = base / "expenses.csv"
path.write_text("name,amount\nlunch,8000\n", encoding="utf-8")
print(path.name, path.suffix, path.stem)
print(path.is_file(), base.is_dir())
print(sorted(p.name for p in base.glob("*.csv")))
予想結果です。
expenses.csv .csv expenses True True ['expenses.csv']
検索と存在確認の役割を理解する
glob("*.csv")は指定フォルダー、rglob("*.csv")はその下のフォルダーも検索します。ファイルだけが対象ならis_file()で絞り、表示順を一定にするなら結果を並べ替えます。
exists()で確認した後でも、実際の操作までに対象が変わる可能性があります。存在確認は分かりやすい説明に役立ちますが、権限不足、同時変更、ディスク障害を排除しません。重要な書き込みには、例外処理と上書き方針も必要です。
実行場所と外部入力のパスを確認する
別の作業フォルダーから実行すると、その場所の下へ別のlab-dataができます。それが正しいかは、決めたパスの契約によります。作成したCSVを開き、見出しと支出の行を確認します。ファイル名を変えてname・stem・suffixを比較したら、元へ戻してください。
片付ける前には絶対パスを解決し、この実習で作った不要なファイルだけを対象にします。外部から渡されるパスでは、親への移動、絶対パス、シンボリックリンクも考慮します。文字列の先頭が一致するだけでは、解決後の場所が許可フォルダー内だと証明できません。ファイルの一括操作でも、変更前に対象範囲を確認します。
相対パスの基準はソースの保存場所ではなく現在の作業フォルダーです。別の場所から python C:/work/demo/script.py を実行すると、Path("out.txt") はその別の場所を指します。ソースの隣に保存するなら Path(__file__).resolve().parent / "out.txt" を使い、書き込み前に確定したパスを表示して確認します。




