pathlib — Object-oriented filesystem paths
pathlib menggantikan os.path dengan objek path yang bisa digabung pakai operator dan punya method sendiri.
Intisari
- Gabungkan path dengan operator
/, bukan string concat atauos.path.join. read_text()danwrite_text()menghapus kebutuhan blokwith open(...)untuk file kecil.glob("**/*.md")menelusuri folder secara rekursif dalam satu baris.mkdir(parents=True, exist_ok=True)adalahmkdir -pversi Python.- Objek
Pathbisa langsung dipakai di hampir semua fungsi stdlib yang menerima path.
Perbandingan langsung
| Tugas | os.path (lama) | pathlib |
|---|---|---|
| Gabung path | os.path.join(a, b, c) | Path(a) / b / c |
| Baca file | open(p).read() | p.read_text() |
| Ada tidaknya | os.path.exists(p) | p.exists() |
| Nama file | os.path.basename(p) | p.name |
| Folder induk | os.path.dirname(p) | p.parent |
| Ekstensi | os.path.splitext(p)[1] | p.suffix |
| Buat folder bertingkat | os.makedirs(p, exist_ok=True) | p.mkdir(parents=True, exist_ok=True) |
Membuat dan menggabung
from pathlib import Path
p = Path("data/dokumen.json")
p = Path.home() / "roadmap" / "catatan.md"
p = Path.cwd() / "output"
p = Path(__file__).parent / "template.txt" # relatif terhadap file script ini
Operator / otomatis benar di semua OS. Di Windows ia menghasilkan
\, di Linux/macOS /. Inilah alasan menyambung path dengan
"data" + "/" + nama adalah bug yang menunggu terjadi.
Bagian-bagian sebuah path
p = Path("/home/budi/proyek/laporan.tar.gz")
p.name # 'laporan.tar.gz'
p.stem # 'laporan.tar' ← perhatikan: hanya melepas ekstensi terakhir
p.suffix # '.gz'
p.suffixes # ['.tar', '.gz']
p.parent # Path('/home/budi/proyek')
p.parents[1] # Path('/home/budi')
p.parts # ('/', 'home', 'budi', 'proyek', 'laporan.tar.gz')
Membaca dan menulis
isi = p.read_text(encoding="utf-8")
data = p.read_bytes()
p.write_text("halo dunia", encoding="utf-8") # menimpa isi lama
p.write_bytes(b"\x00\x01")
# Untuk file besar, tetap pakai context manager supaya tidak masuk memori semua
with p.open(encoding="utf-8") as f:
for baris in f:
proses(baris)
Selalu tulis encoding="utf-8" secara eksplisit. Tanpa itu, Python memakai
encoding default sistem — yang bisa berbeda antara laptop-mu dan server production, dan
menghasilkan bug teks kacau yang sulit dilacak.
Memeriksa
p.exists()
p.is_file()
p.is_dir()
p.stat().st_size # ukuran dalam byte
p.resolve() # jadikan absolut, ikuti symlink
p.absolute() # jadikan absolut tanpa mengikuti symlink
Menelusuri folder
for f in Path("docs").iterdir(): # isi langsung, tidak masuk subfolder
print(f.name)
for f in Path("docs").glob("*.md"): # satu level
...
for f in Path("docs").rglob("*.md"): # rekursif — sama dengan glob("**/*.md")
...
# Pola ini akan sering kamu pakai di ingest pipeline RAG (Fase 7)
dokumen = [f for f in Path("docs").rglob("*") if f.suffix in {".md", ".txt", ".pdf"}]
Membuat, memindahkan, menghapus
Path("out/laporan").mkdir(parents=True, exist_ok=True)
p.rename(p.with_suffix(".bak")) # ganti nama / pindah
p.unlink(missing_ok=True) # hapus file
Path("kosong").rmdir() # hapus folder (harus kosong)
import shutil
shutil.rmtree("folder_beserta_isinya") # pathlib tidak punya ini
Mengubah bagian path
p = Path("data/laporan.json")
p.with_suffix(".csv") # data/laporan.csv
p.with_name("ringkas.json") # data/ringkas.json
p.with_stem("final") # data/final.json
Interoperabilitas
Objek Path mengimplementasikan protokol os.PathLike, jadi hampir semua
fungsi stdlib menerimanya langsung — tidak perlu dikonversi ke string:
import json
data = json.loads(Path("config.json").read_text(encoding="utf-8"))
import csv
with Path("data.csv").open(newline="") as f:
for baris in csv.DictReader(f):
...
Kalau ada library lama yang tetap menolak, konversi dengan str(p).
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.