Sejauh ini seluruh data yang kita olah hidup di memori: begitu program berhenti, list, dictionary, dan string lenyap bersama prosesnya. Berkas (file) di disk berbeda — catatan siswa, konfigurasi aplikasi, dan hasil ekspor bertahan setelah program mati. Chapter ini membahas langkah paling dasar dalam bekerja dengan berkas: membukanya dengan fungsi open(), mengoperasikannya, lalu menutupnya dengan benar.

Fungsi open() dan Object File #

Fungsi bawaan open() meminta sistem operasi menyiapkan sebuah berkas, lalu mengembalikan object file sebagai perantara kita. Semua operasi — menulis, membaca, menutup — adalah method yang dipanggil pada object file tersebut:

python
berkas = open("catatan.txt", "w", encoding="utf-8")
print(berkas.closed)
berkas.write("Belajar file handling di Python.\n")
berkas.close()
print(berkas.closed)

baca = open("catatan.txt", encoding="utf-8")
isi = baca.read()
baca.close()
print(isi, end="")

Output yang Dihasilkan:

text
False
True
Belajar file handling di Python.

Mari kita bedah baris-per-baris:

  1. Baris 1 (berkas = open("catatan.txt", "w", encoding="utf-8")): fungsi open() membuka catatan.txt dengan mode "w" (tulis) dan encoding UTF-8, lalu mengikat object file ke variabel berkas.
  2. Baris 2 (print(berkas.closed)): atribut closed bernilai False karena berkas masih terbuka.
  3. Baris 3-4 (berkas.write(...) dan berkas.close()): method write() menulis satu baris teks; method close() menutup berkas dan mengosongkan buffer ke disk.
  4. Baris 5 (print(berkas.closed)): atribut closed kini bernilai True — object file sudah tidak bisa dipakai lagi untuk operasi I/O.
  5. Baris 7-10: berkas dibuka kembali tanpa mode (default "r", baca), seluruh isinya dibaca dengan read(), lalu berkas ditutup dan isinya dicetak.

Argument kedua open() adalah mode pembukaan; jika mode dihilangkan, Python memakai "r". Argument encoding="utf-8" memastikan teks diterjemahkan dengan kesepakatan byte yang sama di semua mesin — alasan lengkapnya dibahas pada Chapter Encoding dan Newline.

Mode Pembukaan Berkas #

Mode menentukan apa yang boleh dilakukan terhadap berkas dan apa yang terjadi pada isinya:

ModeNamaJika berkas sudah adaJika berkas tidak ada
"r"read (baca)dibuka dari awalFileNotFoundError
"w"write (tulis)isi lama dihapusberkas dibuat
"a"append (tambah)isi lama dipertahankan, tulis di akhirberkas dibuat
"x"exclusive createFileExistsErrorberkas dibuat

Dua modifier dapat digabungkan ke mode mana pun: "b" membuka berkas sebagai biner ("rb", "wb") dan "+" mengizinkan baca sekaligus tulis ("r+"). Mode biner dibahas tuntas pada Chapter Bekerja dengan File Biner.

Mode "x" berguna saat kita tidak sengaja mau menimpa berkas lama. Skrip berikut berhasil saat pertama kali dijalankan:

python
berkas = open("kunci.txt", "x", encoding="utf-8")
berkas.write("File ini dibuat dengan mode x.")
berkas.close()
print(open("kunci.txt", encoding="utf-8").read())

Output yang Dihasilkan:

text
File ini dibuat dengan mode x.

Pemanggilan kedua pada berkas yang sama langsung ditolak sistem operasi:

python
>>> open("kunci.txt", "x")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'kunci.txt'

Mengapa Berkas Harus Ditutup #

Method write() tidak langsung menulis ke disk. Interpreter Python menumpuk data di sebuah buffer di memori, lalu mengosongkannya (flush) ke disk saat buffer penuh atau saat close() dipanggil. Perhatikan percobaan berikut:

python
berkas = open("konsep.txt", "w", encoding="utf-8")
berkas.write("Data penting yang belum di-flush.")

pemantau = open("konsep.txt", encoding="utf-8")
print(repr(pemantau.read()))
pemantau.close()

berkas.close()

pemantau = open("konsep.txt", encoding="utf-8")
print(repr(pemantau.read()))
pemantau.close()

Output yang Dihasilkan:

text
''
'Data penting yang belum di-flush.'

Handle kedua (pemantau) membaca string kosong karena tulisan pertama masih menggantung di buffer, belum menyentuh disk. Setelah berkas.close() dijalankan, buffer dikosongkan dan pembacaan kedua menemukan datanya. Ada dua alasan lain untuk rajin menutup berkas:

  • Setiap berkas terbuka memakan satu file descriptor milik proses. Berkas yang lupa ditutup di dalam loop dapat menghabiskan jatah sistem operasi dan memicu galat “Too many open files”.
  • Bila program crash sebelum close(), data yang masih di buffer berpotensi hilang.

Berkas yang sudah ditutup menolak operasi apa pun:

python
>>> berkas = open("catatan.txt", "w", encoding="utf-8")
>>> berkas.close()
>>> berkas.write("halo lagi")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.

Ketika Berkas Tidak Ditemukan #

Mode "r" tidak pernah membuat berkas baru. Membuka nama yang tidak ada di direktori kerja memicu FileNotFoundError:

python
>>> open("data-tidak-ada.txt")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'data-tidak-ada.txt'

Sebelum membuka berkas untuk dibaca, kita bisa memeriksa keberadaannya terlebih dahulu dengan Path dari module pathlib — caranya dibahas pada Chapter Bekerja dengan pathlib. Pastikan juga berkas berada di direktori kerja yang benar, karena open() mencari nama relatif dari posisi program dijalankan.