Modul `io` dalam Python

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.

  1. Lapisan Asas (RawIOBase)

    RawIOBase mengendalikan byte I/O pada peringkat paling rendah seperti deskriptor fail OS dan peranti.

  2. Lapisan Buffer (BufferedIOBase)

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

  3. Lapisan Teks (TextIOBase)

    TextIOBase menukar urutan byte kepada rentetan dan menguruskan pengekodan. Biasanya, apabila membuka fail dengan fungsi open(), TextIOWrapper dari 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 melihat TextIOBase, BufferedIOBase, dan RawIOBase, 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 IOBase juga boleh digunakan dalam kelas yang lebih tinggi. seekable() dan readable() 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()
  • FileIO ialah implementasi nyata bagi RawIOBase; semua baca dan tulis dilakukan sebagai bytes. Kecekapan boleh dipertingkatkan dengan menggabungkannya dengan lapisan BufferedIOBase di 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 BufferedWriter disimpan sementara dalam buffer ingatan dan dihantar ke lapisan bawah apabila kaedah flush() 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 dengan read(), 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, TextIOWrapper mengekod 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'
  • TextIOWrapper berfungsi 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'
  • StringIO membolehkan 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]
  • BytesIO mempunyai antara muka yang sama seperti BufferedIOBase dan 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.

  • RawIOBase ialah kelas untuk byte I/O pada peringkat OS.
  • BufferedIOBase ialah kelas yang menyediakan lapisan cache yang cekap.
  • TextIOBase ialah kelas yang menguruskan pembacaan dan penulisan rentetan.
  • StringIO dan BytesIO ialah 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.

YouTube Video