Ang `io` Module sa Python
Ipinapaliwanag ng artikulong ito ang io module sa Python.
Ipapaliwanag namin ang io module sa Python gamit ang mga praktikal na halimbawa.
YouTube Video
Ang io Module sa Python
Ang pagpoproseso ng input/output ang pundasyon ng iba’t ibang uri ng operasyon sa datos, gaya ng mga file, network, at standard I/O. Ang io module ng Python ay nagbibigay ng hanay ng mga abstract class na nag-iisa ng mga input/output na operasyong ito. Ang susi upang maunawaan ang module na ito ay ang konsepto ng "stream".
Ano ang isang stream?
Ang stream ay isang abstract na daloy para sa sunod-sunod at tuloy-tuloy na pagbabasa at pagsulat ng datos.
Kapag nagbabasa ng laman ng file kada byte o nagpapadala at tumatanggap ng datos sa network, ang lahat ng ito ay maaaring hawakan bilang mga data stream.
Sa pamamagitan ng pag-aabstract ng mekanismong ito, ang mga file, memory, at network—iba’t ibang pinagkukunan ng I/O—ay maaaring i-handle gamit ang iisang operasyon gaya ng pagbabasa at pagsulat.
Ang io module ng Python ay nagbibigay ng unified interface para sa streams, kaya’t nagiging mas episyente ang paghawak ng parehong text at binary data.
Pangunahing Estruktura ng io Module
Ang io module ay may tatlong-layer na hierarchy ayon sa uri ng streams.
-
Raw Layer (
RawIOBase)Ang
RawIOBaseay humahawak ng pinakamababang antas ng byte I/O, gaya ng OS file descriptors at mga device. -
Buffered Layer (
BufferedIOBase)Ang
BufferedIOBaseay nagbibigay ng cache (buffer) upang mapabuti ang I/O efficiency. AngBufferedReaderatBufferedWriteray pangkaraniwang halimbawa. -
Text Layer (
TextIOBase)Ang
TextIOBaseay nagko-convert ng byte sequence sa mga string at humahawak ng encoding. Kadalasan, kapag nagbubukas ng file gamit angopen()function, angTextIOWrappermula sa layer na ito ang ginagamit.
Dahil sa estrukturang ito, malinaw na pinaghiwalay ng io module ang text at binary I/O habang pinapayagan ang flexible na kombinasyon.
Pangunahing Estruktura ng io Module
Ang RawIOBase ay humahawak ng OS file descriptors sa pinakaibabang layer, tapos may cache mula sa BufferedIOBase sa itaas nito, at ang TextIOBase sa pinakataas ay humahawak ng string conversion.
1import io
2
3# Check the core base classes hierarchy
4print(io.IOBase.__subclasses__())- Ang code na ito ay para sa pagsuri ng pangkat ng abstract classes na namamana mula sa
IOBase. Makikita mo dito angTextIOBase,BufferedIOBase, atRawIOBase, na nagpapatunay sa hierarchical na estraktura.
io.IOBase: Ang Pinakapayak na Class ng Lahat
Ang IOBase ang abstract base class para sa lahat ng I/O object at nagdedepina ng mga karaniwang method gaya ng close(), flush(), at seekable(). Bihira itong ginagamit direkta at kadalasan ay nilalapitan sa pamamagitan ng mga derived class.
1import io
2
3f = io.StringIO("data")
4print(f.seekable()) # True
5print(f.readable()) # True
6print(f.writable()) # True
7f.close()- Ipinapakita ng halimbawang ito na ang mga karaniwang method ng
IOBaseay puwede ring magamit sa mga upper class. Angseekable()atreadable()ay kapaki-pakinabang para suriin ang mga katangian ng isang stream.
io.RawIOBase: Ang Pinakamababang Layer
Ang RawIOBase ang pinaka-malapit na layer sa OS file descriptor at hindi nagbabuffer. Ang pangkaraniwang implementasyon ay ang FileIO, na nagbabasa at nagsusulat kada 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()- Ang
FileIOay konkreto na implementasyon ngRawIOBase; lahat ng pagbabasa at pagsulat ay ginaganap bilangbytes. Mas mapapabuti ang efficiency kung pagsasamahin ito sa upper layer naBufferedIOBase.
io.BufferedIOBase: Gitnang Layer (May Buffering)
Ang BufferedIOBase ay intermediate layer na gumagamit ng buffering para gawing mas episyente ang pag-access ng disk. Ang mga pangunahing implementasyon ay ang BufferedReader, BufferedWriter, BufferedRandom, at 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'- Sa halimbawang ito, ang data na naisulat gamit ang
BufferedWriteray pansamantalang iniimbak sa memory buffer at naipapasa lamang sa lower layer kapag tinawag angflush().
Halimbawa ng BufferedReader
BufferedReader ay isang read-only na buffered stream na sumusuporta sa mahusay na pagbabasa gamit ang peek() at 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'- Ang
peek()ay tumitingin lamang sa data at hindi inaabante ang pointer. Sa pamamagitan ng pagsasama nito saread(), maaari mong kontrolin ng flexible ang buffering.
io.TextIOBase: Pang-text Lamang na Layer
TextIOBase ay isang abstraction layer para sa paghawak ng mga string, na internally gumagawa ng decoding at encoding. Isang tipikal na implementation class ay ang 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'))- Sa halimbawa, ang
TextIOWrapperay nag-e-encode ng string sa UTF-8 at sinusulat ito sa underlying binary stream.
Halimbawa ng Pagbabasa gamit ang TextIOWrapper
Awtomatikong nagkakaroon ng decoding kapag nagbabasa.
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'- Ang
TextIOWrapperang pangunahing class para sa text I/O at nagiging basehan ng halos lahat ng high-level na file operation.
io.StringIO: In-Memory na Text Stream
Ang StringIO ay isang class na pumapayag sa iyo na mag-manage ng string sa memory na parang mga file sila. Ito ay kapaki-pakinabang para sa I/O testing at pansamantalang paggawa ng data.
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'- Ang
StringIOay nagbibigay-daan sa operations na parang file kahit hindi gumagamit ng disk, kaya’t madalas itong gamitin sa unit testing.
io.BytesIO: In-Memory na Binary Stream
Ang BytesIO ay isang in-memory file class para sa paghawak ng mga byte sequence (bytes). Ito ay kapaki-pakinabang sa mga sitwasyon tulad ng binary processing o data compression na ayaw mong gumamit ng mga file.
1import io
2
3buf = io.BytesIO()
4buf.write(b'\x01\x02\x03')
5buf.seek(0)
6print(list(buf.read())) # [1, 2, 3]- Ang
BytesIOay may parehong interface ngBufferedIOBaseat maaaring gamitin bilang kapalit ng maraming file API.
Custom na Streams (Paglikha ng Sariling Mga Klase)
Ang mga klase sa io ay puwedeng i-extend, kaya’t maaari kang gumawa ng sarili mong stream class. Sa ibaba ay isang halimbawa ng TextIOBase subclass na ginagawang lahat uppercase ang text kapag sinusulat.
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"- Basta’t sinusunod mo ang kontrata ng
TextIOBase, maaari kang magtakda ng kahit anong custom na behavior na katulad nito. Madali ring i-extend ang mga stream para sa partikular na gamit, gaya ng files at networks.
Buod
Inoorganisa ng io module ang input/output processing sa isang hierarchy ng mga abstract at concretong klase.
- Ang
RawIOBaseay isang class para sa byte I/O sa OS na antas. - Ang
BufferedIOBaseay isang class na nagbibigay ng efficient cache layer. - Ang
TextIOBaseay class na namamahala sa pagbabasa at pagsusulat ng mga string. - Ang
StringIOatBytesIOay mga class na nagbibigay ng in-memory na stream.
Ang pagkaunawa sa mga klase na ito ay nagbibigay-daan upang mas mauanawaan mo ang takbo ng I/O system ng Python at magamit ito sa operations ng file, komunikasyon sa network, at sa pagdisenyo ng test streams.
Maaari mong sundan ang artikulo sa itaas gamit ang Visual Studio Code sa aming YouTube channel. Paki-check din ang aming YouTube channel.