pathlib, os, dan sys

pathlib, os, dan sys untuk penelusuran direktori, argv, dan environment.

Daftar isi

Tiga modul pustaka standar melingkupi hubungan program dengan sistem berkas dan lingkungannya. Modul pathlib menyusun dan menelusuri jalur berkas sebagai objek, modul os menyediakan akses ke variabel lingkungan dan operasi tingkat sistem, sedangkan modul sys membuka akses ke interpreter, termasuk argumen baris perintah melalui sys.argv. Topik ini membahas ketiganya dengan contoh yang dapat direproduksi penuh di terminal.

Menyusun dan membedah jalur dengan pathlib#

Kelas Path memandang jalur berkas sebagai objek yang memiliki komponen, bukan sekadar string. Operator / menyambung komponen jalur dengan pemisah yang tepat untuk sistem operasi tempat program berjalan, sedangkan atribut name, stem, suffix, parent, dan parts membedah jalur menjadi bagian-bagiannya. Pendekatan ini menghilangkan penggabungan string manual yang rawan keliru.

python Contoh: membedah objek Path
from pathlib import Path

jalur = Path("arsip/cadangan/keuangan-2026.xlsx")
print(jalur.parts)
print(jalur.name, jalur.stem, jalur.suffix)
print(jalur.parent)
gabungan = Path("arsip") / "cadangan" / "data.csv"
print(gabungan)
text Keluaran
('arsip', 'cadangan', 'keuangan-2026.xlsx')
keuangan-2026.xlsx keuangan-2026 .xlsx
arsip/cadangan
arsip/cadangan/data.csv

Atribut parts mengembalikan tuple komponen, name menyimpan nama berkas lengkap dengan ekstensi, stem menyimpan nama tanpa ekstensi, dan suffix menyimpan ekstensi beserta titik di depannya. Operator / bekerja pada Path maupun antara Path dengan string, dan hasilnya selalu memakai pemisah yang benar. Metode keberadaan seperti exists(), is_file(), dan is_dir() melengkapi kelas ini untuk pemeriksaan sebelum berkas diproses.

Menelusuri direktori#

Penelusuran isi direktori dilakukan dengan metode iterdir() untuk satu tingkat, serta glob() dan rglob() untuk pencarian pola. Metode rglob() menelusuri subdirektori secara rekursif. Hasil penelusuran berupa objek Path yang urutannya tidak dijamin, sehingga sorted() digunakan sebelum hasilnya dilaporkan. Contoh berikut membangun struktur direktori sementara, menelusurinya, lalu membersihkannya secara otomatis ketika blok with selesai.

python Contoh: penelusuran direktori sementara
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as tmp:
    root = Path(tmp)
    (root / "laporan").mkdir()
    (root / "laporan" / "januari.txt").write_text("isi laporan")
    (root / "data.csv").write_text("a,b")

    for p in sorted(root.rglob("*")):
        jenis = "berkas" if p.is_file() else "direktori"
        print(p.relative_to(root), jenis)
    txt = sorted(root.rglob("*.txt"))
    print("berkas txt:", [t.name for t in txt])
text Keluaran
data.csv berkas
laporan direktori
laporan/januari.txt berkas
berkas txt: ['januari.txt']

Pola rglob("*") menemukan seluruh entri di semua tingkat, sedangkan rglob("*.txt") hanya menemukan berkas dengan ekstensi txt. Metode relative_to() memotong bagian awal jalur sehingga cetakan tetap ringkas tanpa menampilkan lokasi sementara yang panjang. Pada pekerjaan nyata, pola yang sama dipakai untuk mengumpulkan seluruh berkas laporan dalam sebuah pohon proyek.

Modul os untuk lingkungan dan operasi berkas#

Modul os menyediakan akses ke layanan sistem operasi, dan bagian yang paling sering digunakan adalah os.environ, yaitu kamus variabel lingkungan (environment) yang diwarisi proses. Pembacaan dilakukan dengan kunci spesifik melalui operator in atau metode get() yang menyediakan nilai cadangan, sehingga program tetap berjalan bila kunci tidak ada. Contoh berikut hanya membaca kunci tertentu dan tidak mencetak isi lingkungan secara utuh.

python Contoh: membaca variabel lingkungan secara aman
import os

print("HOME" in os.environ)
print("PATH" in os.environ)
print(os.environ.get("CONTOH_KUNCI", "tidak disetel"))
text Keluaran
True
True
tidak disetel

Kunci HOME dan PATH tersedia pada lingkungan Linux, sedangkan CONTOH_KUNCI sengaja dipilih karena tidak disetel, sehingga metode get() mengembalikan nilai cadangannya. Pada sisi operasi berkas, fungsi os.replace() mengganti nama berkas dan menimpa tujuan secara atomik apabila tujuan sudah ada, sedangkan os.listdir() membaca isi satu direktori.

python Contoh: mengganti nama berkas dengan os.replace
import os
import tempfile

with tempfile.TemporaryDirectory() as tmp:
    lama = os.path.join(tmp, "draf.txt")
    baru = os.path.join(tmp, "final.txt")
    with open(lama, "w", encoding="utf-8") as f:
        f.write("isi")
    os.replace(lama, baru)
    print(sorted(os.listdir(tmp)))
text Keluaran
['final.txt']

Fungsi os.path.join() menyambung komponen jalur dalam bentuk string dan merupakan padanan lama dari operator / milik pathlib. Setelah os.replace() dijalankan, isi direktori hanya memuat final.txt, yang menunjukkan nama lamanya sudah tidak ada. Untuk kode baru, pathlib menjadi pilihan utama, sedangkan os tetap diperlukan untuk variabel lingkungan dan fungsi sistem yang tidak disediakan pathlib.

Modul sys dan argumen baris perintah#

Modul sys berisi objek yang terikat pada interpreter yang sedang berjalan. Daftar sys.argv menyimpan kata-kata yang diketik pada baris perintah, dengan sys.argv[0] berisi nama berkas skrip dan elemen berikutnya berisi argumennya. Berkas berikut menghitung argumen yang diterima lalu menyapanya satu per satu.

python salam.py
import sys

jumlah = len(sys.argv) - 1
print(f"Argumen diterima: {jumlah}")
for arg in sys.argv[1:]:
    print("sapaan untuk", arg)
text Keluaran
Argumen diterima: 0

Ketika dijalankan tanpa argumen, daftar sys.argv hanya memuat nama skripnya, sehingga pengurangan satu menghasilkan nol. Pola ini menjaga program tetap aman ketika dijalankan tanpa argumen, sebab pengaksesan langsung sys.argv[1] tanpa pemeriksaan akan menimbulkan IndexError. Berikut adalah hasilnya bila dua argumen dikirim dari terminal.

bash
# menjalankan salam.py dengan dua argumen posisi
python3 salam.py Ali Budi
text Keluaran
Argumen diterima: 2
sapaan untuk Ali
sapaan untuk Budi

Selain sys.argv, modul ini menyediakan sys.platform yang berisi nama sistem operasi seperti linux, dan sys.version_info yang menyimpan versi interpreter sebagai tuple. Keduanya berguna untuk percabangan yang menyesuaikan perilaku program dengan lingkungannya.

python Contoh: informasi interpreter dari sys
import sys

print(sys.platform)
print(sys.version_info.major, sys.version_info.minor)
print(sys.maxsize > 2**32)
text Keluaran
linux
3 12
True

Nilai sys.platform berbeda antar sistem operasi, sehingga keluaran di atas berlaku untuk lingkungan Linux tempat contoh ini dijalankan. Atribut version_info dipecah menjadi komponen mayor dan minor, sedangkan sys.maxsize yang lebih besar dari 2^32 menandakan interpreter berukuran 64 bit. Daftar sys.path yang memuat lokasi pencarian modul juga tersedia di modul ini, tetapi isinya bergantung pada instalasi sehingga tidak dicetak utuh di sini.

Kesalahan umum#

Kesalahan pertama adalah mengakses argumen tanpa memeriksa jumlahnya. Pengaksesan sys.argv[1] pada pemanggilan tanpa argumen menimbulkan error berikut.

python Contoh: mengakses argumen yang tidak ada
import sys

try:
    sys.argv[1]
except IndexError as e:
    print("IndexError:", e)
text Keluaran
IndexError: list index out of range

Perbaikannya adalah menguji len(sys.argv) terlebih dahulu, atau memanfaatkan modul argparse yang menangani validasi argumen secara menyeluruh. Kesalahan kedua adalah menyambung jalur berkas dengan penjumlahan string seperti "arsip" + "/" + nama. Bentuk ini hanya benar pada sistem operasi yang pemisahnya garis miring, sedangkan operator / milik pathlib memilih pemisah yang tepat secara otomatis.

Kesalahan ketiga adalah mencetak sys.path atau os.environ secara utuh untuk debugging. Keluarannya panjang, bergantung mesin, dan dapat membocorkan nilai sensitif, sehingga inspeksi dilakukan dengan kunci atau indeks tertentu saja. Apabila lokasi pencarian modul perlu diperiksa, cetak satu elemen tertentu atau uji keanggotaan satu jalur dengan operator in.

Ringkasan#

  • pathlib.Path membedah jalur melalui parts, name, stem, suffix, dan parent, serta menyambung komponen dengan operator /.
  • Penelusuran direktori menggunakan iterdir(), glob(), dan rglob(), dengan hasil berupa objek Path yang urutannya perlu disortir sebelum dilaporkan.
  • os.environ dibaca per kunci melalui operator in atau get() dengan nilai cadangan, dan os.replace() mengganti nama berkas dengan menimpa tujuan.
  • sys.argv menyimpan argumen baris perintah dengan nama skrip pada indeks nol, sedangkan sys.platform dan sys.version_info menggambarkan lingkungan interpreter.

Referensi#