Soal 1Mana cara yang direkomendasikan untuk membangun path yang tidak rusak baik di Windows maupun Linux?
os dan pathlib — Path File dan Operasi Direktori
Pelajari modul os.path dan pathlib Python dari dasar. Bangun path yang bekerja di OS apa pun, list dan telusuri direktori secara rekursif, dan pecah path menjadi bagian-bagian dengan objek Path — semuanya praktik langsung.
Dua modul menangani path file dan direktori — os.path yang lebih lama dan pathlib yang lebih baru dan mudah dibaca. Artikel ini menelusuri konstruksi path yang independen dari OS, listing direktori dan traversal rekursif, dan memecah path menjadi bagian-bagian dengan objek Path, dalam urutan itu.
os.path — Bangun Path yang Independen dari OS
Pemisah path berbeda menurut OS. Windows memakai \ (backslash), sedangkan Linux dan macOS memakai /. Hard-coding `"data/sales/2024.csv"` langsung di kodemu jalan di Linux dan Mac, tapi Windows bisa salah membaca path saat runtime.
Jika kamu memecah bagian-bagian dan melewatkan ke os.path.join("data", "sales", "2024.csv"), Python memilih separator yang benar saat itu juga berdasarkan OS tempat ia berjalan.
/ di Linux / Mac dan \ di Windows. Jangan menanam karakter separator manual — itu trik untuk tetap portabel.| Fungsi | Arti | Contoh |
|---|---|---|
| os.path.join(*parts) | Gabungkan path dengan separator OS | join('data', 'sales') → 'data/sales' |
| os.path.exists(p) | Apakah path ada | True / False |
| os.path.isfile(p) | Apakah file (bukan direktori) | True / False |
| os.path.isdir(p) | Apakah direktori | True / False |
| os.path.basename(p) | Nama file atau folder paling akhir | basename('data/x.csv') → 'x.csv' |
| os.path.dirname(p) | Path induk dengan ekor dilepas | dirname('data/x.csv') → 'data' |
| os.path.splitext(p) | Pisah ekstensi | splitext('x.csv') → ('x', '.csv') |
Latihan 2 — Pisahkan Nama dan Ekstensi dengan basename dan splitext
Jangan jejalkan semuanya di satu baris — assign langkah demi langkah ke variabel perantara dan pisahkan nama file dari ekstensinya. basename menarik nama file paling akhir dari path lengkap, dan splitext memecah nama itu menjadi tuple (nama, ekstensi).
os.listdir dan os.walk — Listing Direktori dan Traversal Rekursif
Saat kamu ingin menarik isi folder ke Python, pakai os.listdir untuk hanya satu level dan os.walk untuk turun rekursif ke subfolder. os.listdir mengembalikan list nama (baik file maupun subfolder) langsung di dalam folder yang kamu spesifikasikan, sedangkan os.walk menelusuri seluruh subtree secara rekursif dan menghasilkan tuple (path saat ini, list nama subfolder, list nama file) satu level pada satu waktu.
import os
# Satu level: nama langsung di bawah 'data'
print(os.listdir("data"))
# → ['sales', 'inventory']
# Rekursif: telusuri semua di bawah 'data'
for dirpath, dirnames, filenames in os.walk("data"):
print(dirpath, filenames)
# → data ['sales', 'inventory'] []
# data/sales [] ['2024_q1.csv', '2024_q2.csv']
# data/inventory [] ['items.json']
glob — Pencocokan Pola untuk Mengumpulkan File
Saat kamu ingin mengambil hanya file yang cocok dengan kondisi — seperti hanya file dengan ekstensi `.csv` — modul glob adalah jalur terpendek. Tulis target sebagai pola memakai wildcard seperti * (string apa pun) atau ** (kedalaman apa pun) dan kamu mendapat list path yang cocok.
* cocok dengan string apa pun di level yang sama, ** melintasi sejumlah level apa pun (membutuhkan recursive=True).import glob
# File CSV langsung di bawah data/sales
print(glob.glob("data/sales/*.csv"))
# → ['data/sales/2024_q1.csv', 'data/sales/2024_q2.csv']
# Pencarian rekursif di bawah data (** + recursive=True)
print(glob.glob("data/**/*.csv", recursive=True))
# → ['data/sales/2024_q1.csv', 'data/sales/2024_q2.csv']
Wildcard ** glob Berpasangan dengan recursive=True
Tanda asterisk ganda di glob.glob("data/**/*.csv") adalah wildcard yang melintasi sejumlah level apa pun. Tapi tanpa recursive=True, ia berperilaku seperti * biasa dan tidak akan menemukan apa pun di folder yang lebih dalam. Selalu lewatkan argumen itu saat kamu ingin pencarian rekursif.
pathlib.Path — Operasi Path Berbasis Objek
Sementara os.path adalah library yang menangani path sebagai string, sejak Python 3.4 pendekatan yang direkomendasikan adalah pathlib.Path, yang memperlakukan path itu sendiri sebagai objek. Bangun dengan Path("data/sales/2024_q1.csv") dan kamu bisa mengakses tiap bagian lewat atribut seperti .parent untuk folder induk, .name untuk bagian paling akhir, .stem untuk nama tanpa ekstensi, dan .suffix untuk ekstensi.
os.path.dirname / basename / splitext terpisah.from pathlib import Path
p = Path("data") / "sales" / "2024_q1.csv" # Gabung dengan operator /
print(p) # data/sales/2024_q1.csv
print(p.parent) # data/sales
print(p.name) # 2024_q1.csv
print(p.stem) # 2024_q1
print(p.suffix) # .csv
print(p.exists()) # True
# Baca isi (wrapper di sekitar with open)
print(p.read_text()) # Isi CSV
# List subfolder (setara dengan os.walk)
for sub in Path("data").rglob("*.csv"):
print(sub)
`os.path` berbasis string, `pathlib.Path` berbasis objek — keduanya menawarkan operasi yang sama. Tabel di bawah memetakan tiap tugas di antara mereka.
| Yang ingin kamu lakukan | Gaya os.path | Gaya pathlib |
|---|---|---|
| Gabung | os.path.join('data', 'x.csv') | Path('data') / 'x.csv' |
| Folder induk | os.path.dirname(p) | p.parent |
| Nama file | os.path.basename(p) | p.name |
| Nama tanpa ekstensi | Pakai os.path.splitext(p)[0] | p.stem |
| Ekstensi | os.path.splitext(p)[1] | p.suffix |
| Cek keberadaan | os.path.exists(p) | p.exists() |
| Pencarian rekursif | glob.glob('**/*.csv', recursive=True) | Path('.').rglob('*.csv') |
| Baca | with open(p) as f: f.read() | p.read_text() |
Pilih pathlib untuk Kode Baru
Pathlib direkomendasikan untuk kode baru. Saat API library lama membutuhkan path string (driver DB tertentu, misalnya), konversi dengan str(p). os.path tidak akan ke mana-mana, jadi mengetahui kedua pemetaan menjaga kamu nyaman membaca kode legacy juga.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Mana yang paling cocok untuk menelusuri setiap level folder secara rekursif?
Soal 3Diberikan p = Path("data/sales/2024_q1.csv"), apa nilai dari p.stem?