Membaca hanyalah setengah cerita: program yang bermanfaat perlu menyimpan hasil — laporan, log aktivitas, data yang diekspor ke aplikasi lain. Penulisan berkas teks di Python berpusat pada dua method, write() dan writelines(), namun ada beberapa perilaku yang wajib dipahami sebelum data kita benar-benar aman di disk: buffer, mode "w" yang menghapus isi lama, dan writelines() yang diam-diam tidak menambahkan baris baru.
write() Menulis dan Melaporkan Jumlah Karakter #
Method write() menuliskan string persis apa adanya dan mengembalikan jumlah karakter yang berhasil ditulis:
with open("jurnal.txt", "w", encoding="utf-8") as berkas:
jumlah = berkas.write("Hari pertama belajar Python.\n")
print("Karakter yang ditulis:", jumlah)
jumlah = berkas.write("Hari kedua: membaca dan menulis file.\n")
print("Karakter yang ditulis:", jumlah)
print(open("jurnal.txt", encoding="utf-8").read(), end="")Output yang Dihasilkan:
Karakter yang ditulis: 29
Karakter yang ditulis: 38
Hari pertama belajar Python.
Hari kedua: membaca dan menulis file.Mari kita telaah baris-baris kuncinya:
- Baris 1 (
with open("jurnal.txt", "w", encoding="utf-8") as berkas:): mode"w"membuat berkas baru — atau menghapus isi lama bila sudah ada, bahaya yang dibahas dua section di bawah. - Baris 2 (
jumlah = berkas.write("Hari pertama belajar Python.\n")): methodwrite()mengembalikan jumlah karakter yang ditulis; nilainya disimpan lalu dicetak pada baris berikutnya. - Baris 7 (
print(open("jurnal.txt", encoding="utf-8").read(), end="")): berkas dibuka lagi untuk membuktikan hasilnya di disk; fungsiopen()tanpawithseperti ini boleh dipakai untuk berkas sekali baca yang segera dibuang.
Pemanggilan write() kedua melanjutkan posisi tulis di tempat yang sama — dalam satu sesi pembukaan, tulisan menumpuk berurutan. Nilai baliknya (29 dan 38) dihitung dalam jumlah karakter, termasuk karakter \n di akhir string. Perlu dicatat juga: write() tidak menambahkan baris baru otomatis; jika string tidak diakhiri \n, tulisan berikutnya menempel di baris yang sama. Semua contoh pada chapter ini memakai mode teks sehingga argument write() harus berupa str — object bytes justru ditolak sampai kita pindah ke mode biner pada Chapter Bekerja dengan File Biner.
writelines() Tidak Menambahkan Baris Baru #
Nama writelines() sering menyesatkan pemula. Method ini hanya menulis setiap elemen iterable secara berurutan tanpa menyisipkan apa pun di antaranya:
tugas = ["Matematika\n", "Fisika\n", "Kimia\n"]
with open("tugas-tanpa-newline.txt", "w", encoding="utf-8") as berkas:
berkas.writelines(["Matematika", "Fisika", "Kimia"])
with open("tugas-newline.txt", "w", encoding="utf-8") as berkas:
berkas.writelines(tugas)
print("=== tugas-tanpa-newline.txt ===")
print(open("tugas-tanpa-newline.txt", encoding="utf-8").read())
print("=== tugas-newline.txt ===")
print(open("tugas-newline.txt", encoding="utf-8").read(), end="")Output yang Dihasilkan:
=== tugas-tanpa-newline.txt ===
MatematikaFisikaKimia
=== tugas-newline.txt ===
Matematika
Fisika
KimiaPada berkas pertama, ketiga mata pelajaran menempel menjadi satu karena elemen list-nya memang tanpa \n. Nama writelines() menyerupai readlines(), tetapi keduanya tidak simetris: readlines() mempertahankan karakter \n di setiap baris, sedangkan writelines() tidak menambahkannya. Tanggung jawab menyediakan \n ada pada data kita.
Mode w Menghapus Seluruh Isi Lama #
Perilaku paling berbahaya dari open() berada di mode "w": berkas lama dipotong kosong (truncate) begitu open() dipanggil, sebelum satu karakter pun ditulis:
with open("laporan.txt", "w", encoding="utf-8") as berkas:
berkas.write("Laporan lengkap tahun 2025\n")
berkas.write("Berisi 500 baris analisis\n")
print("=== sebelum ditimpa ===")
print(open("laporan.txt", encoding="utf-8").read(), end="")
with open("laporan.txt", "w", encoding="utf-8") as berkas:
berkas.write("Draf baru\n")
print("=== sesudah ditimpa mode w ===")
print(open("laporan.txt", encoding="utf-8").read(), end="")Output yang Dihasilkan:
=== sebelum ditimpa ===
Laporan lengkap tahun 2025
Berisi 500 baris analisis
=== sesudah ditimpa mode w ===
Draf baruLaporan 500 baris lenyap begitu open("laporan.txt", "w") dieksekusi — bahkan bila program kemudian crash sebelum sempat menulis apa pun. Perilaku yang sama berlaku untuk mode "w+" yang mengizinkan baca sekaligus tulis. Penulisan ulang berkas yang ada hampir selalu lebih aman lewat tiga langkah: tulis ke berkas sementara, periksa hasilnya, baru ganti nama. Chapter Temporary Files menyediakan alat untuk pola tersebut.
Menambah Isi dengan Mode a #
Mode "a" (append) menulis di akhir isi lama tanpa menghapus apa pun. Melanjutkan jurnal.txt dari contoh pertama:
with open("jurnal.txt", "a", encoding="utf-8") as berkas:
berkas.write("Hari ketiga: mode append.\n")
print(open("jurnal.txt", encoding="utf-8").read(), end="")Output yang Dihasilkan:
Hari pertama belajar Python.
Hari kedua: membaca dan menulis file.
Hari ketiga: mode append.Dua baris lama tetap utuh dan tulisan baru menyusul di belakangnya. Mode "a" adalah pilihan tepat untuk log aktivitas dan data yang terus bertambah. Mode "x" dari Chapter Membuka dan Menutup File melengkapi pilihan ini untuk kasus “hanya boleh dibuat sekali”.
flush() — Memaksa Data Keluar dari Buffer #
Seperti dibahas pada Chapter Membuka dan Menutup File, tulisan menumpuk di buffer memori sebelum benar-benar ditulis ke disk. Method flush() memaksa buffer dikosongkan tanpa menutup berkas:
berkas = open("pesan.txt", "w", encoding="utf-8")
berkas.write("Ditulis, di-flush, tetapi belum di-close.")
berkas.flush()
pemantau = open("pesan.txt", encoding="utf-8")
print(repr(pemantau.read()))
pemantau.close()
berkas.close()Output yang Dihasilkan:
'Ditulis, di-flush, tetapi belum di-close.'Handle kedua langsung menemukan datanya meski berkas belum ditutup. Dalam praktik sehari-hari, close() — atau akhir blok with — sudah otomatis meng-flush, sehingga flush() eksplisit hanya dibutuhkan pada kasus khusus: program berjalan lama yang log-nya harus segera terlihat, atau saat berkas dibaca proses lain sebelum penulis selesai.