Sejauh ini kita menulis nama berkas sebagai string polos: "data/penjualan.txt". Pendekatan ini cepat rapuh — menggabungkan bagian path dengan +, mengurai ekstensi dengan split("."), dan berdoa pemisah folder (/ di Linux, \ di Windows) cocok dengan sistem operasi pembaca. Module pathlib (hadir sejak Python 3.4) menggantikan semua itu dengan class Path: object yang mewakili lokasi berkas sekaligus membawa puluhan operasi siap pakai.
Object Path dan Operator / #
Class Path mengubah string lokasi menjadi object yang bisa dirakit dan diperiksa:
from pathlib import Path
folder = Path("data")
berkas = folder / "penjualan" / "februari.txt"
print(berkas)
print(type(berkas))
print(berkas.parts)Output yang Dihasilkan:
data/penjualan/februari.txt
<class 'pathlib.PosixPath'>
('data', 'penjualan', 'februari.txt')Mari kita bedah hasilnya:
- Baris 3-4 (
folder / "penjualan" / "februari.txt"): operator/yang biasa pembagian bilangan di-overload olehPathmenjadi perakit path — jauh lebih rapi daripada+ "/" +. - Baris 7 (
print(type(berkas))): di Linux kita mendapatPosixPath, di WindowsWindowsPath; keduanya anak dariPathdengan antarmuka sama, jadi kode kita tetap portabel. - Baris 8 (
print(berkas.parts)): attributepartsmemecah path menjadi tuple komponennya — berguna untuk pemeriksaan dan iterasi.
Path yang dirakit belum menyentuh disk sama sekali; Path hanyalah nama sampai method seperti write_text() dipanggil.
Memeriksa dan Membaca Berkas Sekaligus #
Method paling sering dipakai sehari-hari: pemeriksaan keberadaan dan baca-tulis singkat:
from pathlib import Path
Path("arsip").mkdir(exist_ok=True)
Path("arsip/catatan.txt").write_text("Catatan penting milik Budi.", encoding="utf-8")
p = Path("arsip/catatan.txt")
print("exists() :", p.exists())
print("is_file() :", p.is_file())
print("is_dir() :", p.is_dir())
print("read_text():", p.read_text(encoding="utf-8"))Output yang Dihasilkan:
exists() : True
is_file() : True
is_dir() : False
read_text(): Catatan penting milik Budi.Tiga method pemeriksaan menjawab tiga pertanyaan berbeda: exists() untuk “apakah ada di disk”, is_file() untuk “apakah berkas biasa”, dan is_dir() untuk “apakah direktori” (folder — dibahas tuntas pada Chapter Mengelola Direktori). Pasangan write_text()/read_text() membuka, menulis/membaca, lalu menutup berkas dalam satu panggilan — cukup untuk berkas kecil; untuk berkas besar tetap gunakan open() beserta iterasinya.
name, stem, suffix, dan parent #
Mengurai bagian-bagian path adalah pekerjaan yang rawan salah bila dikerjakan dengan method string. Path menyediakannya sebagai attribute:
from pathlib import Path
p = Path("arsip/laporan/penjualan-februari.txt")
print("name :", p.name)
print("stem :", p.stem)
print("suffix :", p.suffix)
print("parent :", p.parent)
print("parent dari parent:", p.parent.parent)Output yang Dihasilkan:
name : penjualan-februari.txt
stem : penjualan-februari
suffix : .txt
parent : arsip/laporan
parent dari parent: arsipPerhatikan urutan tampilan di atas: name adalah nama berkas lengkap dengan ekstensi, stem nama tanpa ekstensi, suffix ekstensi beserta titiknya, dan parent berupa Path baru berisi lokasi induk — yang tentu saja punya parent lagi. Mengganti ekstensi pun ringkas: p.with_suffix(".csv") menghasilkan Path baru tanpa mengubah berkas lama.
pathlib vs os.path #
Module os.path adalah cara klasik yang masih banyak kita temui di kode lama. Tabel ini memetakan padanannya:
| Tugas | os.path (klasik) | pathlib (modern) |
|---|---|---|
| Menggabungkan path | os.path.join("data", "a.txt") | Path("data") / "a.txt" |
| Cek keberadaan | os.path.exists("a.txt") | Path("a.txt").exists() |
| Nama berkas | os.path.basename(p) | p.name |
| Direktori induk | os.path.dirname(p) | p.parent |
| Ekstensi | os.path.splitext(p) | p.suffix |
Semua fungsi open(), csv, dan json menerima object Path langsung — open(berkas) dengan berkas berupa Path bekerja sama seperti dengan string. Untuk kode baru, pathlib adalah pilihan default; os.path cukup kita pahami agar bisa membaca program lama.
Mencari Berkas dengan glob() #
Method glob() mencari berkas yang cocok dengan pola tertentu dan mengembalikan iterator Path:
from pathlib import Path
folder = Path("catatan-glob")
folder.mkdir(exist_ok=True)
(folder / "harian.txt").write_text("harian", encoding="utf-8")
(folder / "mingguan.txt").write_text("mingguan", encoding="utf-8")
(folder / "backup.json").write_text("{}", encoding="utf-8")
for berkas in sorted(folder.glob("*.txt")):
print(berkas)Output yang Dihasilkan:
catatan-glob/harian.txt
catatan-glob/mingguan.txtPola "*.txt" mencocokkan semua nama berakhiran .txt di dalam folder, dan sorted() menjadikan urutan hasil pasti. Pola lain yang sering dipakai: "data/*.csv" untuk satu subfolder, "???.txt" untuk nama tiga karakter, dan "**/*.py" lewat rglob() untuk pencarian rekursif ke seluruh subfolder. Hasil glob() juga bisa dirantai — setiap elemennya sudah berupa Path yang siap diperiksa, dibaca, atau diolah lebih lanjut.