4-3

ディレクトリと木構造

ディレクトリの木構造📁project/📁src/📁data/📄README.md📄main.py📄utils.py

ディレクトリとパス

コンピュータのファイルシステムは、木構造(ツリー構造)で表現されます。ディレクトリ(フォルダ)がノード、ファイルが葉にあたります。

python
# パスの例# Linux/Mac: /home/user/documents/sample.txt# Windows:   C:\Users\user\Documents\sample.txt

pathlibモジュール

Python 3.4以降で標準ライブラリとして利用できる pathlib は、パスをオブジェクトとして扱えるため使いやすいです。

python
from pathlib import Path# カレントディレクトリcwd = Path.cwd()print(cwd)   # 例: /home/user# ホームディレクトリhome = Path.home()print(home)  # 例: /home/user

パスの作成と操作

python
from pathlib import Pathp = Path("/home/user/documents")# パスの結合(/ 演算子で可能)file_path = p / "sample.txt"print(file_path)   # /home/user/documents/sample.txt# パスの各部分へアクセスprint(file_path.name)      # sample.txt(ファイル名)print(file_path.stem)      # sample(拡張子なし)print(file_path.suffix)    # .txt(拡張子)print(file_path.parent)    # /home/user/documents(親ディレクトリ)

ファイルの存在確認

python
from pathlib import Pathp = Path("sample.txt")p.exists()     # ファイルまたはディレクトリが存在するかp.is_file()    # ファイルかどうかp.is_dir()     # ディレクトリかどうか

ディレクトリの内容一覧

python
from pathlib import Pathp = Path(".")   # カレントディレクトリ# 全ファイル・ディレクトリを列挙for item in p.iterdir():    print(item)# 特定のパターンに一致するファイルを列挙for py_file in p.glob("*.py"):    print(py_file)# サブディレクトリも含めて検索for py_file in p.rglob("*.py"):    print(py_file)

ディレクトリの作成と削除

python
from pathlib import Path# ディレクトリの作成Path("new_dir").mkdir()Path("a/b/c").mkdir(parents=True)   # 中間ディレクトリも作成# ファイルの削除Path("sample.txt").unlink()   # ファイルを削除# ディレクトリの削除Path("empty_dir").rmdir()   # 空のディレクトリのみ削除可能

pathlibでのファイル入出力

python
from pathlib import Pathp = Path("sample.txt")# 書き込みp.write_text("Hello, Python!日本語も使えます。", encoding="utf-8")# 読み込みcontent = p.read_text(encoding="utf-8")print(content)# バイナリp_bin = Path("data.bin")p_bin.write_bytes(b"")data = p_bin.read_bytes()

os.pathモジュール

pathlib の前身として広く使われてきた os.path モジュールも知っておくと便利です。

python
import osimport os.path# カレントディレクトリos.getcwd()# パスの結合os.path.join("/home/user", "documents", "sample.txt")# /home/user/documents/sample.txt# 存在確認os.path.exists("sample.txt")os.path.isfile("sample.txt")os.path.isdir("documents")# ファイル名と拡張子を分割os.path.splitext("sample.txt")   # ("sample", ".txt")

練習: ファイル一覧表示

基礎

指定したディレクトリ内の全ファイルの名前とサイズを表示する関数 list_files(directory) を定義してください。

練習: 拡張子でフィルタリング

基礎

指定ディレクトリ内の指定した拡張子のファイルをすべて返す関数 find_by_extension(directory, ext) を定義してください。