Kursus Python / Mengelola path berkas dan folder dengan pathlib

pathlib.Path mewakili path berkas dan folder serta menggabungkannya menurut aturan sistem operasi. Path relatif berawal dari working directory atau folder kerja saat ini, yang dapat berbeda dari folder tempat skrip disimpan.

Gabungkan path tanpa merangkai pemisah sendiri

Path("data") / "expenses.csv" menggabungkan komponen path tanpa menyisipkan backslash Windows atau memisahkan logika berdasarkan sistem operasi. Membuat objek Path sendiri tidak membuat folder atau berkas. Operasi seperti mkdir dan write_text yang mengakses sistem berkas.

Path.cwd() menunjukkan working directory. Dalam skrip biasa, Path(__file__).resolve().parent dapat menunjukkan folder sumber yang sudah diresolusikan. Variabel __file__ tidak selalu ada pada sesi interaktif atau notebook, sehingga jangan memakai rumus itu tanpa mempertimbangkan lingkungan eksekusi.

Tentukan basis path sesuai kontrak program: keluaran di folder kerja cocok untuk alat yang dijalankan pada data proyek, sedangkan data di sebelah sumber mungkin memerlukan basis lain. Aturan path juga berbeda dari pencarian modul dan eksekusi paket. Dokumentasi pathlib Python menjadi rujukan operasi yang digunakan di sini.

Buat dan periksa berkas latihan

Gunakan folder latihan baru. Program berikut menulis lab-data/expenses.csv di bawah working directory dan mengganti isi berkas tersebut jika sudah ada. Jangan menjalankannya pada folder yang memuat data bernama sama yang ingin dipertahankan.

Simpan kode lengkap sebagai paths.py dengan encoding UTF-8. Jalankan python paths.py melalui lingkungan proyek dengan Python 3.12 atau lebih baru. Tidak diperlukan paket tambahan; di luar lingkungan virtual, sesuaikan nama perintah ke python3 jika itu interpreter yang tersedia.

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")))

Keluaran yang diharapkan pada folder baru:

expenses.csv .csv expenses
True True
['expenses.csv']

mkdir(exist_ok=True) membolehkan folder tujuan sudah ada, tetapi tidak membuat berkas CSV secara otomatis. write_text menulis teks kemudian menutup berkas. Encoding ditentukan agar pembacaan tidak bergantung pada encoding bawaan lingkungan.

name menghasilkan nama lengkap berkas, suffix ekstensi terakhir, dan stem nama tanpa ekstensi terakhir. Kedua nilai True menyatakan bahwa target berkas dan folder benar-benar ditemukan saat diperiksa. Buka CSV yang dibuat dan pastikan isinya dua baris: header name,amount lalu lunch,8000.

Bedakan hasil pencarian dan jaminan operasi

glob("*.csv") mencari kecocokan pada folder yang ditentukan, sedangkan rglob("*.csv") mencari secara rekursif ke subfolder. Hasil dapat mencakup direktori yang namanya cocok, sehingga tambahkan pemeriksaan is_file() jika hanya berkas yang boleh diproses. Jangan mengandalkan urutan pencarian; gunakan sorted ketika urutan tampilan harus tetap.

Percobaan folder bersih hanya menampilkan satu nama karena program membuat satu CSV. Jika ada CSV lain pada lab-data, daftar hasil berubah tanpa berarti program rusak. Nama pola dan isi folder merupakan bagian kondisi percobaan.

Hasil exists() atau is_file() merupakan pemeriksaan pada suatu waktu. Target dapat berubah sebelum operasi berikutnya. Pemeriksaan tersebut tidak menghilangkan kesalahan izin, perubahan serentak, disk penuh, atau kegagalan perangkat. Operasi penting masih memerlukan penanganan pengecualian dan kebijakan penggantian isi yang jelas.

exist_ok=True juga bukan izin mengabaikan semua kesalahan. Jika lab-data adalah berkas biasa, pembuatan direktori tetap gagal. Jika expenses.csv merupakan direktori, penulisan juga gagal; jenis pesan sistem dapat berbeda. Untuk path folder bertingkat yang induknya belum ada, pertimbangkan parents=True hanya jika pembuatan seluruh induk memang dikehendaki.

Bandingkan folder kerja dan tetapkan batas target

  1. Jalankan versi asli di folder latihan dan periksa isi CSV. Catat Path.cwd() serta path.resolve() bila lokasi keluaran belum jelas.
  2. Ganti hanya nama expenses.csv menjadi report.txt. Nilai nama dan ekstensi berubah, sedangkan pencarian *.csv tidak lagi memasukkan berkas baru itu. Gunakan folder bersih agar sisa percobaan tidak membingungkan.
  3. Jalankan skrip melalui path lengkap dari working directory lain yang disiapkan untuk latihan. Kode asli membuat lab-data pada folder kerja lain tersebut, bukan otomatis di sebelah paths.py.
  4. Pulihkan nama dan lokasi latihan awal, lalu cocokkan hasil aslinya. Saat membersihkan, periksa path absolut dan hapus hanya berkas percobaan yang telah Anda identifikasi.

Jika output memang harus berada di sebelah skrip, basisnya dapat diubah menjadi Path(__file__).resolve().parent / "lab-data". Itu perubahan kontrak lokasi, bukan perbaikan yang selalu benar untuk semua program. Folder sumber yang hanya boleh dibaca juga mungkin tidak cocok sebagai tujuan keluaran.

Untuk path yang datang dari luar program, perhatikan .., path absolut, dan symbolic link. Membandingkan awalan string saja tidak membuktikan target berada dalam folder yang diizinkan. Resolusikan target dan periksa hubungannya dengan basis yang ditentukan; pada operasi sensitif, perubahan link atau target secara serentak tetap harus dipertimbangkan. Hindari memperlakukan pemeriksaan path sederhana sebagai jaminan keamanan universal.