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.
-
Lapisan Mentah (
RawIOBase)RawIOBasemenangani I/O byte level terendah, seperti file descriptor OS dan perangkat. -
Lapisan Buffer (
BufferedIOBase)BufferedIOBasemenyediakan cache (buffer) untuk meningkatkan efisiensi I/O.BufferedReaderdanBufferedWriteradalah contoh tipikal. -
Lapisan Teks (
TextIOBase)TextIOBasemengonversi urutan byte menjadi string dan menangani encoding. Biasanya, saat membuka berkas dengan fungsiopen(),TextIOWrapperdari 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 melihatTextIOBase,BufferedIOBase, danRawIOBase, 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
IOBasejuga dapat digunakan di kelas tingkat atas.seekable()danreadable()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()FileIOadalah implementasi nyata dariRawIOBase; semua baca dan tulis dilakukan sebagaibytes. Efisiensi dapat ditingkatkan dengan menggabungkannya dengan lapisanBufferedIOBasedi 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
BufferedWriteruntuk sementara disimpan di buffer memori dan benar-benar dipindahkan ke lapisan bawah saat memanggilflush().
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 denganread(), 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,
TextIOWrappermengenkode 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'TextIOWrapperberfungsi 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'StringIOmemungkinkan 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]BytesIOmemiliki antarmuka yang sama denganBufferedIOBasedan 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.
RawIOBaseadalah kelas untuk I/O byte di tingkat OS.BufferedIOBaseadalah kelas yang memberikan lapisan cache yang efisien.TextIOBaseadalah kelas yang mengelola pembacaan dan penulisan string.StringIOdanBytesIOadalah 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.