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:
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:
False
True
Belajar file handling di Python.Mari kita bedah baris-per-baris:
- Baris 1 (
berkas = open("catatan.txt", "w", encoding="utf-8")): fungsiopen()membukacatatan.txtdengan mode"w"(tulis) dan encoding UTF-8, lalu mengikat object file ke variabelberkas. - Baris 2 (
print(berkas.closed)): atributclosedbernilaiFalsekarena berkas masih terbuka. - Baris 3-4 (
berkas.write(...)danberkas.close()): methodwrite()menulis satu baris teks; methodclose()menutup berkas dan mengosongkan buffer ke disk. - Baris 5 (
print(berkas.closed)): atributclosedkini bernilaiTrue— object file sudah tidak bisa dipakai lagi untuk operasi I/O. - Baris 7-10: berkas dibuka kembali tanpa mode (default
"r", baca), seluruh isinya dibaca denganread(), 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:
| Mode | Nama | Jika berkas sudah ada | Jika berkas tidak ada |
|---|---|---|---|
"r" | read (baca) | dibuka dari awal | FileNotFoundError |
"w" | write (tulis) | isi lama dihapus | berkas dibuat |
"a" | append (tambah) | isi lama dipertahankan, tulis di akhir | berkas dibuat |
"x" | exclusive create | FileExistsError | berkas 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:
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:
File ini dibuat dengan mode x.Pemanggilan kedua pada berkas yang sama langsung ditolak sistem operasi:
>>> 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:
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:
''
'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:
>>> 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:
>>> 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.