Modul `io` dalam Python
Artikel ini menerangkan modul io dalam Python.
Kami akan menerangkan modul io dalam Python dengan contoh praktikal.
YouTube Video
Modul io dalam Python
Pemprosesan input/output membentuk asas untuk semua jenis operasi data, seperti fail, rangkaian, dan I/O piawai. Modul io dalam Python menyediakan satu set kelas abstrak yang menyatukan operasi input/output ini. Konsep utama untuk memahami modul ini ialah konsep "aliran" (stream).
Apakah itu aliran?
Aliran (stream) ialah satu aliran abstrak untuk membaca dan menulis data secara turutan dan berterusan.
Apabila membaca kandungan fail byte demi byte atau menghantar dan menerima data melalui rangkaian, semuanya boleh dikendalikan sebagai aliran data.
Dengan membuat mekanisme ini menjadi abstrak, fail, memori, dan rangkaian—sumber I/O yang berbeza—boleh dikendalikan dengan operasi yang sama seperti membaca dan menulis.
Modul io Python menyediakan antara muka yang seragam untuk aliran, membolehkan pengendalian data teks dan binari secara berkesan.
Struktur Asas Modul io
Modul io mempunyai hierarki tiga lapisan mengikut sifat aliran.
-
Lapisan Asas (
RawIOBase)RawIOBasemengendalikan byte I/O pada peringkat paling rendah seperti deskriptor fail OS dan peranti. -
Lapisan Buffer (
BufferedIOBase)BufferedIOBasemenyediakan cache (buffer) untuk meningkatkan kecekapan I/O.BufferedReaderdanBufferedWriteradalah contoh lazim. -
Lapisan Teks (
TextIOBase)TextIOBasemenukar urutan byte kepada rentetan dan menguruskan pengekodan. Biasanya, apabila membuka fail dengan fungsiopen(),TextIOWrapperdari lapisan ini digunakan.
Dengan struktur ini, modul io memisahkan I/O teks dan binari dengan jelas sambil membenarkan gabungan yang fleksibel.
Struktur Asas Modul io
RawIOBase mengendalikan deskriptor fail OS di bahagian paling bawah, dengan BufferedIOBase menambah cache di atasnya, dan pada bahagian atas TextIOBase mengendalikan penukaran rentetan.
1import io
2
3# Check the core base classes hierarchy
4print(io.IOBase.__subclasses__())- Kod ini adalah untuk memeriksa kumpulan kelas abstrak yang mewarisi dari
IOBase. Anda boleh melihatTextIOBase,BufferedIOBase, danRawIOBase, yang mengesahkan struktur hierarki tersebut.
io.IOBase: Kelas Asas untuk Semua
IOBase ialah kelas asas abstrak untuk semua objek I/O, yang menentukan kaedah biasa seperti close(), flush(), dan seekable(). Ia 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 bahawa kaedah umum dalam
IOBasejuga boleh digunakan dalam kelas yang lebih tinggi.seekable()danreadable()berguna untuk memeriksa sifat sesuatu aliran.
io.RawIOBase: Lapisan Paling Bawah
RawIOBase ialah lapisan yang paling hampir kepada deskriptor fail OS dan tidak melakukan buffering. Implementasi biasa adalah FileIO, yang membaca dan menulis mengikut 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()FileIOialah implementasi nyata bagiRawIOBase; semua baca dan tulis dilakukan sebagaibytes. Kecekapan boleh dipertingkatkan dengan menggabungkannya dengan lapisanBufferedIOBasedi atas.
io.BufferedIOBase: Lapisan Pertengahan (Dengan Buffering)
BufferedIOBase ialah lapisan pertengahan yang melakukan buffering, menjadikan akses cakera lebih cekap. Implementasi utama ialah 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'- Dalam contoh ini, data yang ditulis melalui
BufferedWriterdisimpan sementara dalam buffer ingatan dan dihantar ke lapisan bawah apabila kaedahflush()dipanggil.
Contoh BufferedReader
BufferedReader ialah aliran berpenampan baca sahaja yang menyokong pembacaan cekap 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 "mengintai" data tanpa menggerakkan penuding. Dengan menggabungkannya denganread(), anda boleh mengawal buffering secara fleksibel.
io.TextIOBase: Lapisan Teks Sahaja
TextIOBase ialah lapisan abstraksi untuk mengendalikan rentetan, secara dalaman melakukan penyahkodan dan pengekodan. Kelas implementasi yang tipikal ialah 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'))- Dalam contoh ini,
TextIOWrappermengekod rentetan kepada UTF-8 dan menulisnya ke dalam aliran binari asas.
Contoh Membaca dengan TextIOWrapper
Penyahkodan dilakukan secara automatik semasa 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 asas untuk I/O teks dan menjadi asas kepada hampir semua operasi fail peringkat tinggi.
io.StringIO: Aliran Teks Dalam Ingatan
StringIO ialah kelas yang membolehkan anda mengendalikan rentetan dalam ingatan seolah-olah ia adalah fail. Ia berguna untuk ujian I/O dan penjanaan 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'StringIOmembolehkan operasi seperti fail tanpa menggunakan cakera dan digunakan secara meluas dalam ujian unit.
io.BytesIO: Aliran Binari Dalam Ingatan
BytesIO ialah kelas fail dalam ingatan untuk mengendalikan urutan byte (bytes). Ia berguna untuk situasi seperti pemprosesan binari atau pemampatan data di mana anda tidak mahu menggunakan fail.
1import io
2
3buf = io.BytesIO()
4buf.write(b'\x01\x02\x03')
5buf.seek(0)
6print(list(buf.read())) # [1, 2, 3]BytesIOmempunyai antara muka yang sama sepertiBufferedIOBasedan boleh digunakan sebagai pengganti kepada banyak API fail.
Aliran Tersuai (Mencipta Kelas Asal)
Kelas-kelas dalam io boleh dikembangkan, membolehkan anda mencipta kelas aliran anda sendiri. Di bawah adalah contoh subkelas TextIOBase yang menukarkan semua teks kepada huruf besar semasa 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"- Selagi anda mematuhi kontrak
TextIOBase, anda boleh menentukan tingkah laku khusus seperti ini. Ia juga mudah untuk mengembangkan aliran untuk kegunaan tertentu, seperti fail dan rangkaian.
Ringkasan
Modul io menyusun pemprosesan input/output ke dalam hierarki kelas abstrak dan konkrit.
RawIOBaseialah kelas untuk byte I/O pada peringkat OS.BufferedIOBaseialah kelas yang menyediakan lapisan cache yang cekap.TextIOBaseialah kelas yang menguruskan pembacaan dan penulisan rentetan.StringIOdanBytesIOialah kelas yang menyediakan aliran dalam ingatan.
Memahami kelas-kelas ini membolehkan anda memahami dengan tepat cara kerja sistem I/O Python dan mengaplikasikannya pada operasi fail, komunikasi rangkaian, dan reka bentuk aliran ujian.
Anda boleh mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Sila lihat juga saluran YouTube kami.