Ada dua cara bekerja dengan path di Python: os.path yang sudah tua dan pathlib yang lebih modern. Kode os.path penuh pemanggilan fungsi bersarang seperti os.path.join(os.path.dirname(__file__), 'data') — susah dibaca, apalagi waktu di-review orang lain. pathlib memecahnya jadi objek Path yang bisa digabung pakai operator /, jadi maksud kodenya kelihatan dalam sekali lihat.

Kenapa pathlib?

pathlib masuk ke standard library sejak Python 3.4, jadi kamu tidak perlu install apa pun. Semua fungsi os.path — join, split, exists, isdir, dirname, basename — punya padanannya di sini, tapi bentuknya berorientasi objek. Objek Path tahu dia file atau direktori, bisa diiterasi, dan operator / dipakai untuk menggabung path dengan aman lintas sistem operasi. Di Windows path memakai backslash, di Linux slash; pathlib yang menangani perbedaan itu untukmu.

from pathlib import Path

# path manual pakai string biasa
p = Path("/home/kamu/proyek/data/mentah.csv")
print(p)          # /home/kamu/proyek/data/mentah.csv

# gabung path dengan operator /
data_dir = Path("/home/kamu/proyek") / "data"
print(data_dir)   # /home/kamu/proyek/data

# path relatif juga jalan
rel = Path("laporan") / "2026" / "oktober.csv"
print(rel)        # laporan/2026/oktober.csv

Membaca dan Menulis File

Path punya read_text() dan write_text() bawaan. Untuk file kecil sampai sedang, ini jauh lebih singkat daripada open() manual dengan context manager. Kalau filenya besar, tetap pakai open() supaya seluruh isi tidak ditahan di memori sekaligus.

python
from pathlib import Path

lokasi = Path("laporan") / "oktober.txt"

# tulis (buat direktori induk dulu kalau belum ada)
lokasi.parent.mkdir(parents=True, exist_ok=True)
lokasi.write_text("Total penjualan Oktober: 1.240.000\n", encoding="utf-8")

# baca seluruh isi
isi = lokasi.read_text(encoding="utf-8")
print(isi)

# baca per baris sekalian
for baris in lokasi.read_text(encoding="utf-8").splitlines():
    print(baris)

Selalu tulis encoding="utf-8" secara eksplisit. Default encoding di Windows (cp1252) beda dengan Linux/macOS, dan file yang kamu tulis di satu sistem bisa jadi karakter acak waktu dibuka di sistem lain.

Iterasi Direktori: iterdir, glob, rglob

Untuk mendaftar isi direktori, iterdir() mengembalikan semua entri. Kalau butuh filter nama file, glob() cocok untuk pola satu level, sementara rglob() mencari rekursif sampai ke subfolder paling dalam. Keduanya menerima pola wildcard * dan ?.

python
from pathlib import Path

proyek = Path("/home/kamu/proyek")

# semua entri di level pertama
for entri in proyek.iterdir():
    print(entri.name, "| file" if entri.is_file() else "| direktori")

# semua file .csv satu level di bawah
for csv_file in proyek.glob("*.csv"):
    print(csv_file)

# semua file .csv di seluruh subfolder (rekursif)
for csv_file in proyek.rglob("*.csv"):
    print(csv_file)

rename(), unlink(), mkdir(), dan replace() menangani pemindahan, penghapusan, dan pembuatan entri tanpa os.rename atau os.remove. Ini juga jadi tempat natural untuk mengarsipkan file hasil olahan ke folder terpisah.

python
from pathlib import Path

sumber = Path("data") / "mentah.csv"
tujuan = Path("data") / "arsip" / "mentah_2026.csv"

# buat folder arsip kalau belum ada
tujuan.parent.mkdir(parents=True, exist_ok=True)

# pindah + ganti nama sekaligus
sumber.rename(tujuan)

# hapus file tanpa error kalau filenya memang tidak ada
(Path("data") / "sampah.tmp").unlink(missing_ok=True)

unlink() menghapus permanen — file tidak masuk ke recycle bin atau trash. Pastikan path-nya benar sebelum menjalankannya, apalagi kalau kamu menggabungkannya dengan rglob().

Mengurai Nama File: name, stem, suffix, parent

Objek Path punya properti untuk memecah nama tanpa manipulasi string manual: .name, .stem (nama tanpa ekstensi), .suffix (ekstensi dengan titik), .parent, dan .parts. Properti ini berguna untuk batch rename, misalnya mengganti ekstensi sekumpulan file sekaligus.

python
from pathlib import Path

f = Path("/home/kamu/proyek/laporan/oktober.csv")

print(f.name)       # oktober.csv
print(f.stem)       # oktober
print(f.suffix)     # .csv
print(f.parent)     # /home/kamu/proyek/laporan
print(f.parts)      # ('/', 'home', 'kamu', 'proyek', 'laporan', 'oktober.csv')

# ganti ekstensi jadi .txt
baru = f.with_suffix(".txt")
print(baru)         # /home/kamu/proyek/laporan/oktober.txt

# path absolut (menyelesaikan relatif dan symlink)
print(f.resolve())  # /home/kamu/proyek/laporan/oktober.csv

pathlib menangani sebagian besar urusan file dan direktori yang selama ini kamu tulis dengan os.path. Kalau kamu sedang memproses banyak file sekaligus, gabungkan dengan pemanggilan perintah eksternal lewat subprocess, atau beri nama file hasil dengan timestamp pakai datetime. Coba refactor satu skrip lama kamu sekarang: ganti setiap os.path.join dan os.path.exists dengan operator / dan .exists(), lalu lihat berapa banyak baris yang hilang.