Python & AI Tutorials Logo
Pemrograman Python

27. Membaca dari dan Menulis ke File

Sampai sekarang, semua data di program kita bersifat sementara—disimpan di variabel yang akan hilang saat program berakhir. Untuk membuat program yang mengingat informasi antar eksekusi, kita perlu bekerja dengan file. File memungkinkan kita menyimpan data ke disk dan membacanya kembali nanti, yang mendukung berbagai hal mulai dari pengaturan konfigurasi hingga penyimpanan data pengguna.

Di bab ini, kamu akan belajar cara membaca dari dan menulis ke file teks di Python. Kita akan mulai dengan memahami path file dan bagaimana Python menemukan file, lalu lanjut ke membuka, membaca, menulis, dan menutup file dengan benar. Kamu akan belajar tentang berbagai mode file, encoding teks, dan cara menangani error umum yang terjadi saat operasi file.

27.1) Path File dan Current Working Directory

Sebelum kita bisa bekerja dengan file, kita perlu memahami bagaimana Python menemukannya di sistem file komputer kamu.

27.1.1) Memahami Path File

Sebuah path file adalah alamat sebuah file di komputer kamu. Ini memberi tahu Python secara tepat di mana menemukan sebuah file. Ada dua jenis path:

Path absolut menentukan lokasi lengkap dari root sistem file:

  • Windows: C:\Users\Alice\Documents\data.txt
  • macOS/Linux: /home/alice/documents/data.txt

Path relatif menentukan lokasi relatif terhadap current working directory:

  • data.txt (file di direktori saat ini)
  • reports/sales.txt (file di subdirektori)
  • ../config.txt (file di direktori induk)

Current working directory (CWD) adalah folder tempat Python mencari file saat kamu menggunakan path relatif. Saat kamu menjalankan sebuah skrip Python, CWD adalah direktori tempat kamu menjalankan perintah, tidak selalu tempat file skrip berada.

Sebagai contoh:

bash
# Directory structure:
/home/alice/
  └── projects/
      └── script.py
 
# Running from the projects folder:
$ cd /home/alice/projects
$ python script.py
# CWD is /home/alice/projects
 
# Running from the parent folder:
$ cd /home/alice
$ python projects/script.py
# CWD is /home/alice (not where script.py is!)

Kamu bisa mengecek current working directory dengan:

python
import os
 
# Ambil current working directory
current_dir = os.getcwd()
print(f"Current directory: {current_dir}")

Output:

Current directory: /home/alice/projects/file_demo

Fungsi os.getcwd() mengembalikan path absolut dari current working directory. Ini berguna untuk memahami di mana Python akan mencari file saat kamu menggunakan path relatif.

Memahami current working directory itu penting karena itulah yang menentukan di mana Python akan mencari saat kamu memakai path relatif seperti "data.txt". Jika kamu menjalankan skrip dari /home/alice/projects/ dan membuka "data.txt", Python akan mencari /home/alice/projects/data.txt.

27.1.2) Menggunakan Path Relatif Secara Efektif

Saat bekerja dengan file, path relatif sering lebih praktis daripada path absolut karena membuat kode kamu portabel—kode tetap bekerja terlepas dari lokasi folder project di komputer yang berbeda.

Berikut pola path relatif yang umum:

python
# File di current working directory
filename = "student_grades.txt"
 
# File di subdirektori (folder data di dalam direktori saat ini)
filename = "data/student_grades.txt"
 
# File di direktori induk
filename = "../shared_data.txt"

Untuk contoh-contoh di bab ini, kita terutama akan menggunakan nama file sederhana seperti "data.txt". Ini berarti:

  • File data harus berada di direktori yang sama dengan tempat kamu menjalankan perintah Python
  • Jika skrip kamu ada di /home/alice/projects/ dan kamu menjalankan python script.py dari direktori itu, Python akan mencari data.txt di /home/alice/projects/

Pendekatan ini membuat contoh tetap jelas dan fokus pada operasi file, bukan navigasi path. Jika kamu mendapat FileNotFoundError, gunakan os.getcwd() untuk mengecek di mana Python mencari file.

27.1.3) Pemisah Path di Berbagai Sistem Operasi

Sistem operasi yang berbeda menggunakan karakter yang berbeda untuk memisahkan direktori di path:

  • Windows menggunakan backslash: data\reports\sales.txt
  • macOS dan Linux menggunakan forward slash: data/reports/sales.txt

Python menanganinya secara otomatis saat kamu menggunakan forward slash di kode—ini bekerja di semua sistem operasi:

python
# Ini bekerja di Windows, macOS, dan Linux
filename = "data/reports/sales.txt"

Python mengonversi forward slash menjadi pemisah yang sesuai untuk sistem operasi kamu.

27.2) Membuka dan Menutup File

Untuk bekerja dengan file, kita harus terlebih dahulu membuka file tersebut, yang membuat koneksi antara program kita dan file di disk. Saat selesai, kita harus menutup file untuk melepaskan resource sistem dan memastikan semua data tersimpan dengan benar.

27.2.1) Fungsi open()

Fungsi open() membuat sebuah objek file yang merepresentasikan koneksi ke sebuah file. Pada bentuk paling sederhana, kamu memberikan nama file:

python
# Buka file untuk dibaca (mode default)
file = open("message.txt")

Ini membuka file message.txt di direktori saat ini. Fungsi open() mengembalikan sebuah objek file, yang kita simpan di variabel file. Objek ini menyediakan method untuk membaca dari atau menulis ke file.

Namun, pendekatan dasar ini punya masalah kritis: jika terjadi error setelah file dibuka, file bisa saja tidak pernah ditutup. Mari lihat kenapa menutup file itu penting.

27.2.2) Kenapa Menutup File Itu Penting

Saat kamu membuka file, sistem operasi mengalokasikan resource untuk mempertahankan koneksi tersebut. Jika kamu tidak menutup file:

  • Data mungkin tidak tersimpan: Saat menulis ke file, data sering dibuffer di memori dan baru ditulis ke disk saat file ditutup
  • Resource sistem terbuang: Setiap file yang terbuka menghabiskan memori dan file handle
  • Program lain bisa terblokir: Beberapa sistem mencegah program lain mengakses file yang sudah terbuka

Untuk menutup file, panggil method close():

python
file = open("message.txt")
# ... bekerja dengan file ...
file.close()  # Lepaskan resource dan pastikan data tersimpan

27.2.3) Masalah dengan Menutup Secara Manual

Menutup file secara manual rawan kesalahan. Jika exception terjadi di antara membuka dan menutup, pemanggilan close() mungkin tidak pernah dieksekusi:

python
file = open("data.txt")
result = process_data(file)  # Jika ini menimbulkan exception...
file.close()  # ...ini tidak pernah dijalankan!

Ini masalah yang sangat umum sehingga Python menyediakan solusi yang lebih baik: statement with, yang akan kita pelajari di Bagian 27.4. Untuk sekarang, pahami bahwa membuka dan menutup file secara manual memerlukan perhatian ekstra agar close() selalu terpanggil.

27.2.4) Mengecek Apakah File Terbuka

Sebuah objek file memiliki atribut closed yang memberi tahu apakah file sudah ditutup:

python
file = open("data.txt")
print(file.closed)  # Output: False
 
file.close()
print(file.closed)  # Output: True

Begitu file ditutup, mencoba membaca dari atau menulis ke file tersebut akan memunculkan error:

python
file = open("data.txt")
file.close()
 
# This raises ValueError: I/O operation on closed file
content = file.read()

Pesan error tersebut dengan jelas menunjukkan masalahnya: kamu mencoba melakukan operasi I/O (input/output) pada file yang sudah ditutup.

27.3) Memahami Mode File (r, w, a, text vs binary) dan Encoding

Saat membuka file, kamu bisa menentukan sebuah mode yang menentukan operasi apa yang diizinkan dan bagaimana file diperlakukan. Memahami mode itu krusial agar bekerja dengan file secara benar.

27.3.1) Mode Teks vs Mode Biner

File bisa dibuka dalam dua mode dasar:

Mode teks (default) memperlakukan file sebagai berisi teks. Python secara otomatis:

  • Mengonversi line ending menjadi \n terlepas dari platform
  • Menangani encoding teks (mengonversi antara bytes dan string)
  • Mengizinkan membaca dan menulis string

Mode biner memperlakukan file sebagai bytes mentah. Python:

  • Membaca dan menulis objek bytes, bukan string
  • Tidak melakukan konversi atau interpretasi apa pun
  • Digunakan untuk gambar, audio, video, dan file non-teks lainnya

Untuk bab ini, kita akan fokus pada mode teks, yang paling sering kamu gunakan. Mode biner ditandai dengan menambahkan 'b' ke string mode (seperti 'rb' atau 'wb'), tetapi kita tidak membutuhkannya untuk file teks.

27.3.2) Tiga Mode File Utama

Python menyediakan tiga mode utama untuk membuka file teks:

Mode baca ('r') - Membuka file hanya untuk membaca:

python
file = open("data.txt", "r")  # atau cukup open("data.txt")
  • File harus sudah ada, atau Python akan memunculkan FileNotFoundError
  • Kamu bisa membaca dari file tetapi tidak bisa menulis ke dalamnya
  • Ini adalah mode default jika kamu tidak menentukan mode

Mode tulis ('w') - Membuka file untuk menulis:

python
file = open("output.txt", "w")
  • Membuat file jika belum ada
  • Menghapus semua konten yang sudah ada jika file sudah ada
  • Kamu bisa menulis ke file tetapi tidak bisa membaca darinya
  • Gunakan ini saat kamu ingin membuat file baru atau sepenuhnya mengganti file yang sudah ada

Mode tambah ('a') - Membuka file untuk menambahkan (append):

python
file = open("log.txt", "a")
  • Membuat file jika belum ada
  • Mempertahankan konten yang ada dan menambahkan konten baru di akhir
  • Kamu bisa menulis ke file tetapi tidak bisa membaca darinya
  • Gunakan ini saat kamu ingin menambahkan ke file yang sudah ada tanpa kehilangan konten saat ini

Berikut perbandingan bagaimana mode-mode ini memengaruhi file yang sudah ada:

python
# Misalkan data.txt berisi: "Hello\nWorld\n"
 
# Mode baca - konten tidak berubah
file = open("data.txt", "r")
file.close()
# File masih berisi: "Hello\nWorld\n"
 
# Mode tulis - konten dihapus
file = open("data.txt", "w")
file.write("New content\n")
file.close()
# File sekarang berisi: "New content\n"
 
# Mode tambah - konten dipertahankan, konten baru ditambahkan
file = open("data.txt", "a")
file.write("Added line\n")
file.close()
# File sekarang berisi: "New content\nAdded line\n"

27.3.3) Memahami Encoding Teks

Saat kamu bekerja dengan file teks, Python perlu tahu cara mengonversi antara bytes yang tersimpan di disk dan karakter string di program kamu. Proses konversi ini disebut encoding.

Encoding yang paling umum adalah UTF-8, yang bisa merepresentasikan karakter apa pun dari bahasa apa pun. Ini adalah encoding default di Python 3 dan standar untuk file teks modern.

python
# Secara eksplisit tentukan encoding UTF-8 (meskipun biasanya ini default)
file = open("data.txt", "r", encoding="utf-8")

Kenapa encoding itu penting? Pertimbangkan file teks ini yang berisi nama dengan karakter beraksen:

python
# Menulis file dengan karakter khusus
file = open("names.txt", "w", encoding="utf-8")
file.write("José\n")
file.write("François\n")
file.write("Müller\n")
file.close()
 
# Membacanya kembali
file = open("names.txt", "r", encoding="utf-8")
content = file.read()
file.close()
print(content)

Output:

José
François
Müller

Jika kamu mencoba membuka file dengan encoding yang salah, kamu mungkin melihat karakter yang kacau atau mendapatkan error. Selalu gunakan UTF-8 untuk file baru kecuali kamu punya alasan khusus untuk memakai encoding yang berbeda.

27.3.4) Variasi Mode Tambahan

Python menyediakan karakter mode tambahan yang bisa digabung dengan mode utama:

Mode plus mengizinkan membaca dan menulis:

  • 'r+' - Baca dan tulis (file harus ada)
  • 'w+' - Tulis dan baca (menghapus konten yang ada)
  • 'a+' - Tambah dan baca (mempertahankan konten yang ada)

Untuk pemula, lebih jelas membuka file sekali untuk membaca dan secara terpisah untuk menulis daripada memakai mode plus. Kita akan tetap menggunakan mode sederhana ('r', 'w', 'a') di bab ini.

Mode File

Baca 'r'

Tulis 'w'

Tambah 'a'

File harus ada
Hanya baca
Mode default

Buat jika perlu
Hapus yang ada
Hanya tulis

Buat jika perlu
Pertahankan yang ada
Hanya tulis

27.4) Menggunakan with untuk Mengelola File Secara Otomatis

Statement with menyediakan cara yang lebih bersih dan aman untuk bekerja dengan file. Ini otomatis menutup file saat kamu selesai, bahkan jika terjadi error.

27.4.1) Sintaks Statement with

Berikut cara menggunakan with untuk membuka file:

python
with open("data.txt", "r") as file:
    content = file.read()
    print(content)
# File otomatis ditutup di sini

Sintaks ini memiliki beberapa bagian:

  • with - Keyword yang memulai context manager
  • open("data.txt", "r") - Membuka file
  • as file - Membuat variabel untuk mereferensikan objek file
  • : - Memulai blok yang terindentasi
  • Blok terindentasi - Kode yang bekerja dengan file
  • Setelah blok - File otomatis ditutup

Manfaat utamanya: Python menjamin file akan ditutup saat blok with berakhir, terlepas dari bagaimana blok itu berakhir (normal, dengan return, atau karena exception).

27.4.2) Kenapa with Lebih Baik daripada Menutup Manual

Bandingkan dua pendekatan ini:

python
# Menutup manual - berisiko
file = open("data.txt", "r")
content = file.read()
result = process(content)  # Jika ini menimbulkan exception...
file.close()  # ...ini tidak pernah dijalankan
 
# Menggunakan with - aman
with open("data.txt", "r") as file:
    content = file.read()
    result = process(content)  # Bahkan jika ini menimbulkan exception...
# ...file tetap ditutup secara otomatis

Statement with menggunakan protokol context manager Python (yang akan kita bahas lebih detail di Bab 28). Untuk sekarang, anggap ini sebagai jaminan: "Saya akan membersihkan resource ini saat kamu selesai, apa pun yang terjadi."

27.4.3) Bekerja dengan Banyak File

Kamu bisa membuka beberapa file dalam satu statement with:

python
with open("input.txt", "r") as infile, open("output.txt", "w") as outfile:
    content = infile.read()
    outfile.write(content.upper())
# Kedua file otomatis ditutup di sini

Ini berguna saat kamu perlu membaca dari satu file dan menulis ke file lain secara bersamaan. Kedua file dijamin ditutup dengan benar, bahkan jika terjadi error.

27.4.4) Objek File Hanya Valid di Dalam Blok with

Begitu blok with berakhir, file ditutup dan kamu tidak bisa lagi menggunakan objek file:

python
with open("data.txt", "r") as file:
    content = file.read()
    print("Inside with block:", file.closed)  # Output: Inside with block: False
 
print("Outside with block:", file.closed)  # Output: Outside with block: True
 
# This raises ValueError: I/O operation on closed file
more_content = file.read()

Perilaku ini disengaja—ini mencegah kamu tidak sengaja menggunakan file yang sudah ditutup. Jika kamu butuh konten file di luar blok with, simpan ke sebuah variabel (seperti content di atas) sebelum blok berakhir.

Mulai titik ini dan seterusnya di bab ini, kita akan menggunakan with untuk semua operasi file. Ini adalah pendekatan yang direkomendasikan dan yang sebaiknya kamu gunakan di kode kamu sendiri.

27.5) Membaca File Teks

Sekarang kita paham cara membuka file dengan aman menggunakan with, mari kita jelajahi berbagai cara untuk membaca konten dari file teks.

27.5.1) Membaca Seluruh File dengan read()

Method read() membaca seluruh konten file sebagai satu string:

python
with open("message.txt", "r") as file:
    content = file.read()
    print(content)

Jika message.txt berisi:

Welcome to Python!
This is a text file.
It has multiple lines.

Output:

Welcome to Python!
This is a text file.
It has multiple lines.

Method read() menyertakan semua karakter newline (\n) dari file. Saat kamu mencetak string tersebut, Python menampilkan setiap baris di baris terpisah karena karakter newline ini.

Kamu juga bisa membaca sejumlah karakter tertentu dengan memberikan angka ke read():

python
with open("message.txt", "r") as file:
    first_ten = file.read(10)  # Baca 10 karakter pertama
    print(f"First 10 characters: '{first_ten}'")

Output:

First 10 characters: 'Welcome to'

Membaca seluruh file itu sederhana dan bekerja baik untuk file kecil. Namun, untuk file besar (megabyte atau gigabyte), membaca semuanya sekaligus bisa menghabiskan terlalu banyak memori. Untuk kasus tersebut, membaca baris demi baris lebih efisien.

27.5.2) Membaca Baris demi Baris dengan readline()

Method readline() membaca satu baris dari file, termasuk karakter newline di akhir:

python
with open("message.txt", "r") as file:
    line1 = file.readline()
    line2 = file.readline()
    line3 = file.readline()
    print(f"Line 1: {line1}")
    print(f"Line 2: {line2}")
    print(f"Line 3: {line3}")

Output:

Line 1: Welcome to Python!
 
Line 2: This is a text file.
 
Line 3: It has multiple lines.
 

Perhatikan ada baris kosong tambahan di output. Setiap baris yang dibaca dari file berakhir dengan \n, dan print() menambahkan newline lain. Untuk menghindari ini, gunakan method rstrip() untuk menghapus whitespace di akhir:

python
with open("message.txt", "r") as file:
    line1 = file.readline().rstrip()
    line2 = file.readline().rstrip()
    print(f"Line 1: {line1}")
    print(f"Line 2: {line2}")

Output:

Line 1: Welcome to Python!
Line 2: This is a text file.

Saat readline() mencapai akhir file, ia mengembalikan string kosong "". Ini memungkinkan kamu mendeteksi saat tidak ada lagi baris yang bisa dibaca:

python
with open("message.txt", "r") as file:
    while True:
        line = file.readline()
        if line == "":  # Akhir file
            break
        print(line.rstrip())

Namun, ada cara yang lebih Pythonic untuk membaca file baris demi baris.

27.5.3) Mengiterasi Baris dengan for Loop

Objek file bersifat iterable, yang berarti kamu bisa melakukan loop langsung dengan for loop. Ini adalah cara paling umum dan Pythonic untuk membaca file baris demi baris:

python
with open("message.txt", "r") as file:
    for line in file:
        print(line.rstrip())

Output:

Welcome to Python!
This is a text file.
It has multiple lines.

Pendekatan ini:

  • Lebih rapi: Tidak perlu readline() atau mengecek string kosong
  • Lebih efisien: Python membaca file per chunk, tidak memuat seluruh file ke memori
  • Lebih Pythonic: Menggunakan iterasi, yang merupakan konsep inti Python

Setiap iterasi loop membaca baris berikutnya dari file. Saat tidak ada lagi baris, loop berakhir otomatis.

27.5.4) Membaca Semua Baris ke dalam List dengan readlines()

Method readlines() membaca semua baris dari file dan mengembalikannya sebagai list string:

python
with open("message.txt", "r") as file:
    lines = file.readlines()
 
print(f"Number of lines: {len(lines)}")
for i, line in enumerate(lines, start=1):
    print(f"Line {i}: {line.rstrip()}")

Output:

Number of lines: 3
Line 1: Welcome to Python!
Line 2: This is a text file.
Line 3: It has multiple lines.

Setiap elemen dalam list adalah string yang berisi satu baris dari file, termasuk karakter newline-nya. Ini berguna saat kamu perlu:

  • Mengakses baris berdasarkan indeks: lines[0], lines[1], dan seterusnya
  • Memproses baris berkali-kali
  • Mengetahui jumlah total baris sebelum memproses

Namun, seperti read(), readlines() memuat seluruh file ke memori. Untuk file besar, mengiterasi dengan for loop lebih hemat memori.

Metode Membaca

read

readline

iterasi for loop

readlines

Seluruh file sebagai string
Sederhana tapi boros memori

Satu baris setiap kali
Kontrol manual

Satu baris per iterasi
Paling Pythonic

Semua baris sebagai list
Akses acak

27.6) Menulis dan Menambahkan (Append) ke File Teks

Menulis ke file sama pentingnya dengan membaca. Python menyediakan method sederhana untuk membuat file baru atau memodifikasi file yang sudah ada.

27.6.1) Menulis ke File dengan write()

Untuk menulis ke file, buka file dalam mode tulis ('w') dan gunakan method write():

python
with open("output.txt", "w") as file:
    file.write("Hello, World!\n")
    file.write("This is a new file.\n")

Setelah menjalankan kode ini, output.txt berisi:

Hello, World!
This is a new file.

Poin penting tentang write():

  • Ia menulis sebuah string ke file
  • Ia tidak otomatis menambahkan karakter newline—kamu harus menyertakan \n sendiri
  • Ia mengembalikan jumlah karakter yang ditulis (meskipun biasanya kita abaikan)
  • Jika file sudah ada, mode tulis menghapus semua konten yang sudah ada sebelum menulis

Mari lihat apa yang terjadi saat kita menulis ke file yang sudah ada:

python
# Pertama, buat file dengan beberapa konten
with open("demo.txt", "w") as file:
    file.write("Original content\n")
 
# Sekarang buka lagi dalam mode tulis
with open("demo.txt", "w") as file:
    file.write("New content\n")
 
# Baca file untuk melihat isinya
with open("demo.txt", "r") as file:
    print(file.read())

Output:

New content

Konten aslinya hilang. Mode tulis selalu dimulai dengan file kosong, baik saat membuat file baru maupun menimpa file yang sudah ada.

27.6.2) Menulis Beberapa Baris

Kamu bisa memanggil write() beberapa kali untuk menulis beberapa baris:

python
with open("shopping_list.txt", "w") as file:
    file.write("Apples\n")
    file.write("Bananas\n")
    file.write("Oranges\n")

27.6.3) Menulis Data dari Koleksi

Tugas yang umum adalah menulis data dari list atau koleksi lain ke file:

python
students = ["Alice", "Bob", "Carol", "David"]
 
with open("students.txt", "w") as file:
    for student in students:
        file.write(student + "\n")

Ini membuat students.txt berisi:

Alice
Bob
Carol
David

27.6.4) Menambahkan (Append) ke File

Saat kamu ingin menambahkan konten ke akhir file yang sudah ada tanpa menghapus yang sudah ada, gunakan mode tambah ('a'):

python
# Buat file dengan konten awal
with open("log.txt", "w") as file:
    file.write("Program started\n")
 
# Nanti, tambahkan konten lagi
with open("log.txt", "a") as file:
    file.write("Processing data\n")
    file.write("Processing complete\n")
 
# Baca file untuk melihat semua konten
with open("log.txt", "r") as file:
    print(file.read())

Output:

Program started
Processing data
Processing complete

Mode tambah sangat cocok untuk file log, saat kamu ingin menyimpan catatan kejadian yang terus bertambah. Setiap kali kamu membuka file dalam mode tambah, konten baru ditambahkan di akhir, dan semua yang sudah ada tetap dipertahankan.

27.7) Menangani Error Umum pada File I/O

Operasi file bisa gagal karena banyak alasan: file tidak ada, kamu tidak punya izin untuk mengaksesnya, disk penuh, atau file sedang dibuka oleh program lain. Belajar menangani error ini dengan baik membuat program kamu lebih tangguh dan ramah pengguna.

27.7.1) FileNotFoundError: Saat File Tidak Ada

Error file yang paling umum terjadi saat kamu mencoba membaca file yang tidak ada:

python
# PERINGATAN: Ini akan memunculkan FileNotFoundError jika data.txt tidak ada
with open("data.txt", "r") as file:
    content = file.read()

Jika data.txt tidak ada, Python memunculkan:

FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'

Untuk menangani ini dengan baik, gunakan blok try-except (seperti yang kita pelajari di Bab 25):

python
try:
    with open("data.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("Error: The file 'data.txt' was not found.")
    print("Please check the filename and try again.")

Output (jika file tidak ada):

Error: The file 'data.txt' was not found.
Please check the filename and try again.

Pendekatan ini mencegah program kamu crash dan memberikan pesan yang membantu pengguna.

27.7.2) PermissionError: Saat Kamu Tidak Bisa Mengakses File

Kadang kamu tidak punya izin untuk membaca atau menulis sebuah file:

python
try:
    with open("/root/protected.txt", "r") as file:
        content = file.read()
except PermissionError:
    print("Error: You don't have permission to access this file.")

Error izin bisa terjadi saat:

  • File dimiliki oleh pengguna lain
  • File berada di direktori sistem yang dilindungi
  • File ditandai read-only dan kamu mencoba menulis ke dalamnya
  • Di Windows, file sedang terbuka di program lain

27.7.3) IsADirectoryError: Saat Kamu Mencoba Membuka Direktori

Jika kamu tidak sengaja mencoba membuka sebuah direktori alih-alih file:

python
try:
    with open("my_folder", "r") as file:
        content = file.read()
except IsADirectoryError:
    print("Error: 'my_folder' is a directory, not a file.")

Ini bisa terjadi saat kamu punya file dan direktori dengan nama yang mirip, atau saat kamu lupa menyertakan nama file di sebuah path.

27.7.4) UnicodeDecodeError: Saat Encoding Tidak Cocok

Jika kamu mencoba membaca file dengan encoding yang salah, kamu mungkin mendapat UnicodeDecodeError:

python
try:
    with open("data.txt", "r", encoding="utf-8") as file:
        content = file.read()
except UnicodeDecodeError:
    print("Error: The file encoding doesn't match UTF-8.")
    print("The file might use a different encoding.")

Error ini terjadi saat file berisi bytes yang bukan UTF-8 yang valid. Jika kamu menemui ini, file tersebut mungkin:

  • Menggunakan encoding lain (seperti Latin-1 atau Windows-1252)
  • File biner yang kamu coba baca sebagai teks
  • Rusak

27.7.5) Menangani Beberapa Jenis Error

Kamu bisa menangkap beberapa jenis error dalam satu blok try-except:

python
filename = input("Enter filename: ")
 
try:
    with open(filename, "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print(f"Error: '{filename}' does not exist.")
except PermissionError:
    print(f"Error: You don't have permission to read '{filename}'.")
except IsADirectoryError:
    print(f"Error: '{filename}' is a directory, not a file.")
except UnicodeDecodeError:
    print(f"Error: '{filename}' contains invalid text encoding.")

Ini memberikan pesan error yang spesifik dan membantu untuk setiap jenis masalah. Pengguna tahu persis apa yang salah dan bisa mengambil tindakan yang sesuai.

27.7.6) Menggunakan Handler Exception Catch-All

Kadang kamu ingin menangkap error terkait file yang tidak terduga, di luar tipe spesifik yang sudah kita bahas. Kamu bisa menggunakan handler umum Exception sebagai catch-all setelah handler spesifik:

python
filename = input("Enter filename: ")
 
try:
    with open(filename, "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print(f"Error: '{filename}' not found.")
except PermissionError:
    print(f"Error: No permission to read '{filename}'.")
except IsADirectoryError:
    print(f"Error: '{filename}' is a directory.")
except UnicodeDecodeError:
    print(f"Error: '{filename}' has invalid encoding.")
except Exception as e:
    print(f"Unexpected error reading file: {e}")

Ini memastikan program kamu menangani bahkan error yang tidak kamu antisipasi. Variabel e berisi objek exception, yang mencakup pesan error deskriptif. Mencetaknya memberi pengguna detail teknis tentang apa yang salah.


Bekerja dengan file adalah keterampilan fundamental dalam pemrograman. Kamu sudah belajar cara:

  • Memahami path file dan current working directory
  • Membuka dan menutup file dengan benar
  • Menggunakan mode file yang berbeda untuk membaca, menulis, dan menambahkan
  • Mengelola file secara otomatis dengan statement with
  • Membaca file dengan berbagai method (read(), readline(), iterasi, readlines())
  • Menulis dan menambahkan konten ke file
  • Menangani error umum pada file I/O dengan baik

Keterampilan ini memungkinkan kamu membuat program yang menyimpan data antar eksekusi, memproses file teks, membuat laporan, dan banyak lagi. Di bab berikutnya, kita akan mengeksplor context manager secara mendalam, memahami mekanisme yang membuat statement with bekerja dan cara membuat context manager kamu sendiri untuk mengelola resource di luar file.

© 2025. Primesoft Co., Ltd.
support@primesoft.ai