Lewati ke isi
Profil penulisSeri Buku GIS Kehutanan dan Pertanian/ PY

BAB 8: Gudang Perkakas: Modul, Import, dan Jalur Berkas

Studi kasus: "Skrip jalan di komputer saya, tapi tidak di komputer kantor" #

Analis Muda mengirim skrip ke rekan di kantor cabang. Balasannya singkat: "Galat. Berkas tidak ditemukan." Ternyata skrip itu menyebut folder C:/Data/..., dan folder itu hanya ada di komputer Anda. Pelajaran hari ini: cara memanggil perkakas siap pakai, dan cara menulis alamat berkas supaya skrip bisa berpindah komputer.

Konsep: modul dan jalur dalam tiga kalimat #

Sebuah modul adalah laci perkakas yang sudah disiapkan orang lain, dan import adalah perintah untuk membuka laci itu. Jalur adalah alamat lengkap sebuah berkas, seperti alamat rumah yang ditulis dari kota sampai nomor rumah. Skrip yang baik tidak menulis alamat mati di tengah kode, melainkan menaruhnya di satu tempat di bagian atas supaya mudah diganti.

Ilustrasi 8.1: Jalur dan pohon folder
Skema pohon folder dengan skrip-saya dan data, serta contoh jalur Windows dan jalur macOS atau Ubuntu

Istilah baru di bagian ini:

  • Modul: berkas Python berisi perkakas siap pakai. Contoh: os, shutil, csv.
  • import: perintah memanggil sebuah modul.
  • Jalur (path): alamat lengkap berkas atau folder.
  • Variabel lingkungan: pengaturan bernama yang disimpan oleh sistem operasi, dan bisa dibaca skrip.

Import: membuka laci perkakas #

PYTHONUnduh berkas
import os

print(os.name)
print(os.path.join("data", "paket-b2", "Petak_KPH.gpkg"))

Penjelasannya:

  • import os membuka modul os, perkakas untuk urusan sistem operasi: folder, berkas, dan pengaturan.
  • os.name memberi nama jenis sistem operasi. Di Windows jawabannya nt, di macOS dan Ubuntu posix. [CEK untuk macOS dan Ubuntu]
  • os.path.join merangkai potongan alamat dengan pemisah yang sesuai sistem operasi. Anda tidak perlu mengingat apakah harus \ atau /.
HASIL
nt
data\paket-b2\Petak_KPH.gpkg

Di macOS dan Ubuntu, baris kedua tertulis dengan garis miring biasa: data/paket-b2/Petak_KPH.gpkg.

Ada tiga cara membuka modul:

  • import os, lalu pakai os.makedirs(...). Awalan os. menunjukkan asal perkakas.
  • from os import makedirs, lalu pakai makedirs(...) langsung.
  • from qgis.core import QgsVectorLayer: bentuk kedua yang paling sering Anda temui di skrip GIS.

Perkakas berkas: os dan shutil #

PYTHONUnduh berkas
import os
import shutil

os.makedirs("keluaran", exist_ok=True)
with open("asli.txt", "w") as f:
    f.write("Petak P-01")
shutil.copy("asli.txt", os.path.join("keluaran", "salinan.txt"))
print(os.listdir("keluaran"))
print(os.path.exists(os.path.join("keluaran", "salinan.txt")))
print(os.path.basename("data/paket-b2/Petak_KPH.gpkg"))

Penjelasannya:

  • os.makedirs("keluaran", exist_ok=True) membuat folder. exist_ok=True berarti "jangan galat bila folder sudah ada".
  • Baris with open(...) menulis berkas kecil. Cara kerjanya dibahas di Bab 9.
  • shutil.copy(asal, tujuan) menyalin berkas.
  • os.listdir mendaftar isi folder, dan os.path.exists bertanya apakah sebuah berkas ada.
  • os.path.basename mengambil nama berkas dari jalur lengkap.
HASIL
['salinan.txt']
True
Petak_KPH.gpkg

Menaruh alamat di satu tempat #

Perhatikan cara skrip GIS menyimpan alamat. Alamat mati tidak diselipkan di tengah kode. Ia ditaruh di baris atas, sebagai kotak bernama berhuruf besar. Cara yang lebih baik lagi: alamat boleh diganti dari luar lewat variabel lingkungan.

PYTHONUnduh berkas
import os

DATA = os.environ.get("B2_DATA", r"C:/KPH_Contoh/paket-b2")
print(DATA)

os.environ.get("B2_DATA", ...) bertanya kepada sistem: "Adakah pengaturan bernama B2_DATA?" Bila ada, nilainya dipakai. Bila tidak, dipakai alamat cadangan di ujung.

HASIL
C:/KPH_Contoh/paket-b2

Dua hal penting tentang penulisan alamat:

  • Huruf r di depan kutip (r"C:\Data") membuat garis miring terbalik dibaca apa adanya. Tanpa huruf r, garis miring terbalik dipakai Python untuk tanda khusus, misalnya \n berarti baris baru, dan alamat jadi salah.
  • Garis miring biasa / aman dipakai di Windows, macOS, dan Ubuntu. Karena itu banyak skrip GIS menulis "C:/KPH_Contoh/paket-b2" dengan garis miring biasa.

Tempat Python mencari modul: sys.path #

Saat Anda menulis import namamodul, Python mencari modul itu di sejumlah folder. Daftar folder itu tersimpan di sys.path. Pada Bab 3 Anda sudah melihat baris sys.path.append(...): baris itu menambah satu folder ke daftar.

PYTHONUnduh berkas
import sys

print(type(sys.path).__name__)
sys.path.append("modul-saya")
print(sys.path[-1])
HASIL
list
modul-saya

Jadi sys.path adalah daftar biasa, dan append menambah satu folder di ujung.

Skrip yang dibedah: pembuka b2_03_digitasi.py #

Tujuan. Menyiapkan folder hasil dan menyalin tiga berkas data agar berkas asli tidak berubah saat Anda menggambar.

Bahan. Paket data paket-b2. Variabel lingkungan B2_DATA dan B2_KELUAR boleh diisi, atau ganti alamat cadangannya.

Skrip (bagian pembuka):

PYTHONUnduh berkas
import os
import shutil
from qgis.core import (QgsVectorLayer, QgsRasterLayer, QgsFeature, QgsGeometry, QgsPointXY, QgsPoint, QgsLineString)

DATA = os.environ.get("B2_DATA", r"C:/KPH_Contoh/paket-b2")
KELUAR = os.environ.get("B2_KELUAR", r"C:/KPH_Contoh/keluaran")
os.makedirs(KELUAR, exist_ok=True)
X0, Y0 = 312000.0, 9996000.0          # sudut barat-daya area contoh

# Salin lapisan kosong agar berkas asli di paket data tidak berubah
for nama in ("Jalan_Baru.gpkg", "Persemaian_Baru.gpkg", "Petak_KPH.gpkg"):
    shutil.copy(os.path.join(DATA, nama), os.path.join(KELUAR, nama))

Penjelasan baris demi baris. Nomor baris dihitung dari potongan di atas.

BarisTulisanArtinya
1-2import os, import shutilBuka dua laci perkakas: urusan sistem dan penyalinan berkas.
3from qgis.core import (...)Ambil delapan perkakas khusus dari QGIS. Kurung panjang boleh dipecah ke beberapa baris.
5DATA = os.environ.get(...)Isi kotak DATA dengan lokasi folder data. Bila pengaturan B2_DATA ada, nilainya dipakai.
6KELUAR = os.environ.get(...)Sama, untuk folder hasil.
7os.makedirs(KELUAR, exist_ok=True)Buat folder hasil bila belum ada.
8X0, Y0 = 312000.0, 9996000.0Isi dua kotak sekaligus dengan sepasang angka. Itu koordinat sudut barat-daya area contoh.
10# Salin lapisan kosong ...Komentar yang menjelaskan alasan penyalinan.
11for nama in (...):Ulangi untuk tiga nama berkas. Tanda kurung biasa menandakan tuple (Bab 5).
12shutil.copy(os.path.join(DATA, nama), os.path.join(KELUAR, nama))Rangkai alamat asal dan tujuan dengan os.path.join, lalu salin berkas.

Hasil. Skrip bagian ini tidak mencetak apa-apa. Untuk membuktikan salinannya, tambahkan satu baris di ujung:

PYTHONUnduh berkas
import os
import shutil

DATA = os.environ.get("B2_DATA", r"C:/KPH_Contoh/paket-b2")
KELUAR = os.environ.get("B2_KELUAR", r"C:/KPH_Contoh/keluaran")
os.makedirs(KELUAR, exist_ok=True)
for nama in ("Jalan_Baru.gpkg", "Persemaian_Baru.gpkg", "Petak_KPH.gpkg"):
    shutil.copy(os.path.join(DATA, nama), os.path.join(KELUAR, nama))
print(sorted(os.listdir(KELUAR)))

Dengan B2_DATA menunjuk folder paket-b2 dan B2_KELUAR menunjuk folder hasil yang kosong, layar menampilkan:

TERMINAL
['Jalan_Baru.gpkg', 'Persemaian_Baru.gpkg', 'Petak_KPH.gpkg']

Bagian yang boleh diubah.

  • Baris 5, lokasi data. Ganti alamat cadangan dengan lokasi paket-b2 di komputer Anda. Atau isi variabel lingkungan B2_DATA.
  • Baris 6, lokasi hasil. Pilih folder hasil di tempat yang Anda kuasai, misalnya Dokumen/keluaran.
  • Baris 11, daftar berkas. Tambah atau kurangi nama berkas yang disalin.

Jebakan.

  • Alamat contoh tidak ada di komputer Anda. Bila B2_DATA tidak diisi dan folder C:/KPH_Contoh/paket-b2 tidak ada, shutil.copy berhenti dengan FileNotFoundError. Ganti baris 5.
  • Huruf r hilang pada alamat Windows. Menulis "C:\data\nilai" tanpa huruf r membuat \n dibaca sebagai baris baru. Alamatnya rusak tanpa pesan yang jelas.
  • Mengubah berkas asli. Skrip ini sengaja bekerja pada salinan. Bila Anda menggambar langsung di berkas asli, data contoh ikut berubah.
  • Sistem operasi berbeda. Alamat dengan huruf drive (C:/) hanya ada di Windows. Di macOS dan Ubuntu, pakai alamat seperti /home/anda/.... [CEK]

Latihan variasi. Ubah skrip supaya menyalin hanya Petak_KPH.gpkg, dan mencetak jalur lengkap salinannya.

Contoh jawaban, hanya bagian yang berubah:

PYTHONUnduh berkas
import os
import shutil

DATA = os.environ.get("B2_DATA", r"C:/KPH_Contoh/paket-b2")
KELUAR = os.environ.get("B2_KELUAR", r"C:/KPH_Contoh/keluaran")
os.makedirs(KELUAR, exist_ok=True)
tujuan = os.path.join(KELUAR, "Petak_KPH.gpkg")
shutil.copy(os.path.join(DATA, "Petak_KPH.gpkg"), tujuan)
print("Tersalin ke:", tujuan)

Cek paham #

  1. Apa fungsi os.path.join?
  2. Mengapa alamat Windows sering diawali huruf r?
  3. Apa yang terjadi bila variabel lingkungan B2_DATA tidak ada?

Jawaban.

  1. Merangkai potongan alamat dengan pemisah yang sesuai sistem operasi.
  2. Agar garis miring terbalik dibaca apa adanya, bukan sebagai tanda khusus.
  3. Skrip memakai alamat cadangan yang tertulis di ujung baris os.environ.get(...).

Kesalahan umum #

  • Menyelipkan alamat mati di banyak tempat. Perbaikan: taruh satu kali di bagian atas.
  • Memakai satu garis miring terbalik dalam teks biasa. Perbaikan: tambah huruf r di depan kutip, atau pakai garis miring biasa.
  • Lupa membuat folder hasil. Perbaikan: panggil os.makedirs(..., exist_ok=True) sebelum menulis ke folder itu.

Ringkasan dan latihan #

  • import membuka laci perkakas. os mengurus folder dan berkas, shutil menyalin.
  • os.path.join merangkai alamat sesuai sistem operasi. Garis miring biasa aman di tiga sistem.
  • Taruh alamat di satu tempat, dan bila perlu bisa diganti lewat variabel lingkungan.

Latihan. Tulis skrip yang membuat folder hasil_latihan, membuat berkas catatan.txt di dalamnya, lalu mencetak daftar isi folder itu.

Tabel perbandingan: alamat di tiga sistem operasi #

HalWindowsmacOSUbuntu
Contoh alamatC:/Data/paket-b2/Users/anda/data/paket-b2/home/anda/data/paket-b2
Pemisah folder biasa\//
os.namentposixposix