Modul `io` di Python

Modul `io` di Python

Artikel ini menjelaskan modul io di Python.

Kami akan menjelaskan modul io di Python dengan contoh praktis.

YouTube Video

Modul io di Python

Pemrosesan input/output menjadi dasar untuk semua jenis operasi data, seperti berkas, jaringan, dan I/O standar. Modul io di Python menyediakan sekumpulan kelas abstrak yang menyatukan operasi input/output ini. Konsep utama untuk memahami modul ini adalah ide "stream" (aliran data).

Apa itu aliran (stream)?

Stream adalah aliran abstrak untuk membaca dan menulis data secara berurutan dan terus-menerus.

Saat membaca isi berkas per byte atau mengirim dan menerima data melalui jaringan, semuanya dapat ditangani sebagai aliran data (stream).

Dengan mengabstraksikan mekanisme ini, berkas, memori, dan jaringan—sumber I/O yang berbeda—dapat ditangani dengan operasi umum seperti membaca dan menulis.

Modul io di Python menyediakan antarmuka yang terintegrasi untuk stream, memungkinkan penanganan data teks dan biner secara efisien.

Struktur Dasar Modul io

Modul io memiliki hierarki tiga lapisan sesuai dengan sifat stream-nya.

  1. Lapisan Mentah (RawIOBase)

    RawIOBase menangani I/O byte level terendah, seperti file descriptor OS dan perangkat.

  2. Lapisan Buffer (BufferedIOBase)

    BufferedIOBase menyediakan cache (buffer) untuk meningkatkan efisiensi I/O. BufferedReader dan BufferedWriter adalah contoh tipikal.

  3. Lapisan Teks (TextIOBase)

    TextIOBase mengonversi urutan byte menjadi string dan menangani encoding. Biasanya, saat membuka berkas dengan fungsi open(), TextIOWrapper dari lapisan ini yang digunakan.

Berkat struktur ini, modul io dengan jelas memisahkan I/O teks dan biner sekaligus memungkinkan kombinasi yang fleksibel.

Struktur Dasar Modul io

RawIOBase menangani file descriptor OS di lapisan terendah, BufferedIOBase menambahkan cache di atasnya, dan lapisan teratas TextIOBase menangani konversi string.

1import io
2
3# Check the core base classes hierarchy
4print(io.IOBase.__subclasses__())
  • Kode ini digunakan untuk memeriksa kelompok kelas abstrak yang mewarisi dari IOBase. Anda dapat melihat TextIOBase, BufferedIOBase, dan RawIOBase, sehingga dapat mengonfirmasi struktur hierarkisnya.

io.IOBase: Kelas Dasar dari Semua

IOBase adalah kelas dasar abstrak untuk semua objek I/O, yang mendefinisikan metode umum seperti close(), flush(), dan seekable(). Kelas ini jarang digunakan secara langsung dan biasanya diakses melalui kelas turunan.

1import io
2
3f = io.StringIO("data")
4print(f.seekable())   # True
5print(f.readable())   # True
6print(f.writable())   # True
7f.close()
  • Contoh ini menunjukkan bahwa metode umum dari IOBase juga dapat digunakan di kelas tingkat atas. seekable() dan readable() berguna untuk memeriksa sifat suatu stream.

io.RawIOBase: Lapisan Paling Rendah

RawIOBase adalah lapisan yang paling dekat dengan file descriptor OS dan tidak melakukan buffering. Implementasi tipikalnya adalah FileIO, yang membaca dan menulis per byte.

1import io, os
2
3# Create a low-level FileIO object (no buffering)
4fd = os.open('raw_demo.bin', os.O_RDWR | os.O_CREAT)
5raw = io.FileIO(fd, mode='w+')
6raw.write(b'abc123')
7raw.seek(0)
8print(raw.read(6))  # b'abc123'
9raw.close()
  • FileIO adalah implementasi nyata dari RawIOBase; semua baca dan tulis dilakukan sebagai bytes. Efisiensi dapat ditingkatkan dengan menggabungkannya dengan lapisan BufferedIOBase di atasnya.

io.BufferedIOBase: Lapisan Menengah (Dengan Buffer)

BufferedIOBase adalah lapisan menengah yang melakukan buffering, membuat akses disk menjadi lebih efisien. Implementasi utamanya adalah BufferedReader, BufferedWriter, BufferedRandom, dan BufferedRWPair.

1import io
2
3# Create a buffered binary stream on top of a BytesIO (simulate file)
4base = io.BytesIO()
5buffered = io.BufferedWriter(base)
6buffered.write(b'Python IO buffering')
7buffered.flush()
8base.seek(0)
9print(base.read())  # b'Python IO buffering'
  • Pada contoh ini, data yang ditulis melalui BufferedWriter untuk sementara disimpan di buffer memori dan benar-benar dipindahkan ke lapisan bawah saat memanggil flush().

Contoh BufferedReader

BufferedReader adalah stream buffered hanya-baca yang mendukung pembacaan efisien dengan peek() dan read().

1import io
2
3stream = io.BytesIO(b"1234567890")
4reader = io.BufferedReader(stream)
5print(reader.peek(5))   # b'12345' (non-destructive)
6print(reader.read(4))   # b'1234'
7print(reader.read(3))   # b'567'
  • peek() hanya melihat data tanpa memindahkan pointer. Dengan mengombinasikannya dengan read(), Anda dapat mengontrol buffering secara fleksibel.

io.TextIOBase: Lapisan Khusus Teks

TextIOBase adalah lapisan abstraksi untuk menangani string, yang secara internal melakukan decoding dan encoding. Kelas implementasi yang umum adalah TextIOWrapper.

 1import io
 2
 3# Wrap a binary stream to handle text encoding
 4binary = io.BytesIO()
 5text_stream = io.TextIOWrapper(binary, encoding='utf-8')
 6text_stream.write("\u3053\u3093\u306B\u3061\u306F")
 7text_stream.flush()
 8
 9# Reset stream position
10binary.seek(0)
11
12# Read bytes once
13data = binary.read()
14
15# Show both raw bytes and decoded text
16print("Raw bytes:", data)
17print("Decoded text:", data.decode('utf-8'))
  • Pada contoh ini, TextIOWrapper mengenkode string ke UTF-8 dan menulisnya ke stream biner di bawahnya.

Contoh Membaca dengan TextIOWrapper

Decoding dilakukan secara otomatis saat membaca.

1import io
2
3binary_data = io.BytesIO("Python I/O".encode('utf-8'))
4text_reader = io.TextIOWrapper(binary_data, encoding='utf-8')
5print(text_reader.read())  # 'Python I/O'
  • TextIOWrapper berfungsi sebagai kelas dasar untuk I/O teks dan menjadi dasar untuk hampir semua operasi file tingkat tinggi.

io.StringIO: Stream Teks dalam Memori

StringIO adalah kelas yang memungkinkan Anda menangani string dalam memori seolah-olah itu adalah berkas. Ini berguna untuk pengujian I/O dan pembuatan data sementara.

1import io
2
3text_buf = io.StringIO()
4text_buf.write("In-memory text stream")
5text_buf.seek(0)
6print(text_buf.read())  # 'In-memory text stream'
  • StringIO memungkinkan operasi seperti berkas tanpa menggunakan disk dan banyak digunakan dalam pengujian unit.

io.BytesIO: Stream Biner dalam Memori

BytesIO adalah kelas berkas dalam memori untuk menangani urutan byte (bytes). Ini berguna untuk situasi seperti pemrosesan biner atau kompresi data di mana Anda tidak ingin menggunakan berkas.

1import io
2
3buf = io.BytesIO()
4buf.write(b'\x01\x02\x03')
5buf.seek(0)
6print(list(buf.read()))  # [1, 2, 3]
  • BytesIO memiliki antarmuka yang sama dengan BufferedIOBase dan dapat digunakan sebagai pengganti banyak API file.

Stream Kustom (Membuat Kelas Sendiri)

Kelas dalam io dapat dikembangkan, memungkinkan Anda membuat kelas stream Anda sendiri. Di bawah ini adalah contoh subkelas TextIOBase yang akan mengubah semua teks menjadi huruf besar saat menulis.

 1import io
 2
 3class UpperTextIO(io.TextIOBase):
 4    def __init__(self):
 5        self.buffer = ""
 6    def write(self, s):
 7        self.buffer += s.upper()
 8        return len(s)
 9
10u = UpperTextIO()
11u.write("hello io")
12print(u.buffer)  # "HELLO IO"
  • Selama Anda mengikuti kontrak dari TextIOBase, Anda dapat menentukan perilaku kustom apa saja seperti ini. Anda juga dapat dengan mudah memperluas stream untuk penggunaan spesifik, seperti untuk berkas maupun jaringan.

Ringkasan

Modul io mengatur pemrosesan input/output ke dalam hierarki kelas abstrak dan konkret.

  • RawIOBase adalah kelas untuk I/O byte di tingkat OS.
  • BufferedIOBase adalah kelas yang memberikan lapisan cache yang efisien.
  • TextIOBase adalah kelas yang mengelola pembacaan dan penulisan string.
  • StringIO dan BytesIO adalah kelas yang menyediakan stream di dalam memori.

Memahami kelas-kelas ini memungkinkan Anda memahami cara kerja sistem I/O di Python dengan tepat dan menerapkannya pada operasi berkas, komunikasi jaringan, serta perancangan stream untuk pengujian.

Anda dapat mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Silakan periksa juga saluran YouTube kami.

YouTube Video