Back to IF5100 Pemrograman untuk Data Analitik

Modul dan File

Questions/Cues

  • Mengapa program besar perlu dipecah ke banyak file, dan apa itu modul?
  • Bagaimana cara mengimpor modul dan apa fungsi dot notation?
  • Apa perbedaan import m, from m import *, dan import m as c?
  • Apa saja mode open() dan method utama pada file handle?
  • Mengapa with lebih baik daripada open()/close() manual?
  • Apa konvensi penulisan import yang baik?

Reference Points

  • IF5100 — Modules and Files (Slides 3-22)

Mengapa Modul

Sejauh ini program disimpan dalam satu file, tidak bergantung pada kode yang ditulis sebelumnya, dan tidak menyimpan/mengakses data yang bertahan setelah program selesai. Seiring program membesar, lebih praktis menyimpan bagian berbeda di file berbeda — apalagi bila banyak orang mengerjakan program yang sama, dan program berguna umumnya perlu mengakses kode yang sudah ada (mis. library module).

Membuat dan Mengimpor Modul

Modul adalah file .py berisi definisi dan statement Python — biasanya memuat statement yang dapat dieksekusi dan definisi fungsi.

# circle.py
pi = 3.14159
 
def area(radius):
    return pi * (radius ** 2)
 
def circumference(radius):
    return 2 * pi * radius

Untuk mengaksesnya dari program lain, pakai statement import, lalu dot notation untuk merujuk nama yang didefinisikan di modul:

import circle
pi = 3
print(pi)            # 3      -> nama lokal
print(circle.pi)     # 3.14159 -> nama di modul
print(circle.area(3))

pi dan circle.pi merujuk objek yang berbeda — impor memberi namespace tersendiri.

Varian Statement import

flowchart TD
    A["import circle"] --> A1["Bind nama 'circle';<br/>akses lewat circle.pi, circle.area"]
    B["from circle import *"] --> B1["Bind SEMUA objek modul ke scope kini;<br/>nama 'circle' sendiri TIDAK di-bind, sehingga circle.pi jadi NameError"]
    C["import circle as c"] --> C1["Bind nama 'circle' menjadi 'c';<br/>akses lewat c.pi"]

import circle as c berguna bila nama modul sudah dipakai untuk hal lain, atau untuk menyingkat nama modul yang panjang.

Predefined Packages: math dan calendar

Banyak package berguna sudah menjadi bagian standard library Python; sebagian besar distribusi juga membawa package di luar standar.

import math
print(math.log(x, 2))            # logaritma basis 2
 
import calendar as cal
c = cal.TextCalendar()
print(c.formatmonth(1949, 3))    # cetak kalender Maret 1949
print(cal.day_name[cal.weekday(2033, 12, 25)])  # hari Natal 2033

Operasi File Dasar

File menyimpan hasil dari satu komputasi ke komputasi berikutnya. open() mengembalikan sebuah file handle:

PemanggilanArti
open(fn, 'w')buat file untuk ditulis (menimpa bila sudah ada)
open(fn, 'r')buka file yang ada untuk dibaca
open(fn, 'a')buka file yang ada untuk ditambah (append)

Method pada handle fh:

  • fh.read() → seluruh isi file sebagai satu string
  • fh.readline() → baris berikutnya; fh.readlines() → list of string (satu elemen per baris)
  • fh.write(s) → tulis string s di akhir file; fh.writelines(S) → tulis tiap elemen sekuens S sebagai baris
  • fh.close() → tutup file

File handle juga bisa langsung diiterasi: for line in fh: menghasilkan baris demi baris.

Statement with

with menjamin file selalu ditutup, bahkan bila terjadi error di tengah — menggantikan pola try/finally yang verbose:

with open("kids.txt", 'w') as name_handle:
    n = int(input("Number of kids: "))
    for i in range(n):
        name = input("Enter name: ")
        name_handle.write(name + '\n')
# file otomatis tertutup di sini

Konvensi Import

  1. Satu modul per baris import.
  2. Letakkan semua import di awal program.
  3. Urutkan: modul standar dulu, lalu modul pihak ketiga (mis. lewat Anaconda), terakhir modul spesifik aplikasi.

Summary

Program besar dipecah ke banyak file; sebuah modul adalah file .py berisi definisi dan statement. import m membuat namespace m yang diakses lewat dot notation (m.pi), sehingga m.pi dan pi lokal adalah objek berbeda. Varian: from m import * mem-bind semua objek modul ke scope kini tetapi bukan nama m sendiri; import m as c memberi alias. Standard library menyediakan package seperti math dan calendar. File memberi persistensi antar-eksekusi: open(fn, mode) dengan mode 'w'/'r'/'a' mengembalikan file handle ber-method read/readline/readlines/write/writelines/close, dan handle bisa langsung diiterasi per baris. with open(...) as fh: menjamin file tertutup meski terjadi error. Konvensi import: satu modul per baris, semua di awal, urutan standar → pihak ketiga → aplikasi.