1、io概敘
io模塊提供了python用於處理各種類型I/O的主要工具,主要有三種類型的I/O:文本I/O,二進制I/O和原始I/O;這些都是通用類型,各種後備存儲可使用其中的每一種類型,所以這些類型的具體對象稱爲文件對象。他通常的術語叫流和文件對象。
每個具體流對象都具有各種功能:可以是隻讀,只寫或讀寫。它可以允許任意的隨機訪問;向前或向後尋找任何位置或者只允許順序訪問如套接字或管道的情況下。
所有的流都會檢測提供給它的數據類型,如給二進制流str字符類型的write()的寫方法將會引發一個TypeError異常。
2、io類層次結構
I/O流的實現被組織爲類的層次結構,第一個抽象基類爲ABCs,用於指定不同類別的流,然後提供標準流實現的具體類。
I/O層次結構的頂部是抽象基類IOBase,它定義了流的基本接口,但讀取和寫入流之間沒有分離。
RawIOBase它是IOBase延伸的類,用來處理字節讀取和寫入流,RawIOBase的子類爲機器文件系統中的文件提供接口。
BufferedIOBase類繼承RawIOBase類,它的子類:BufferedWriter,BufferedReader,BufferedRWPair三個緩衝流類,實現功能爲可寫,可讀,以及可讀寫。BufferedRandom子類爲隨機訪問流提供緩衝接口,另一個子類BytesIO是內存中字節流。
TextIOBase類繼承IOBase,用於處理字節表示文本流,並從字符串處理編碼和解碼。它的子類:TextIOWrapper是緩衝的原始流BufferedIOBase的緩衝文本接口,StringIO是文本的內存流。
總結io模塊提供的類層次方法:
類名 | 繼承 | 存根方法 | Mixin方法和屬性 |
IOBase | fileno,seek和truncate | close,closed,__enter__,__exit__,flush,isatty,__iter__,__next__,readable,readline,readlines,seekable,tell,writable,writelines | |
RawIOBaes | IOBase | readinto,write | 繼承的IOBase方法read和readall |
BufferedIOBase | IOBase | detah,read,readl,write | 繼承IOBase方法readinto,readintol |
TextioBase | IOBase | detach,read,readline,write | 繼承IOBase方法encoding,errors,newlines |
3、IO基類
(1)class io.IOBase
所有IO類的抽象基類,作用於字節流,沒有公共構造函數。
它爲派生類提供了許多方法,IOBase類以及其子類都支持迭代器協議。
IOBase提供的數據屬性和方法:
close():沖洗並關閉此流,一旦文件關閉,對文件的任何操作都會引發一次ValueError異常
closed():如果流文件被關閉則返回True否則返回False
fileno():返回流的底層文件描述符爲整數
flush():刷新流到寫入緩衝區
isatty():如果流是交互式即連接到終端設備則返回True否則返回False
readable():如果可以從流中讀取則返回True否則返回False
readline(size=-1):從流中讀取並返回一行,如果size指定,則讀取指定大小字節的數據
readlines(hint=-1):從流中讀取並返回行列表,可以指定hint來控制讀取的行數。
seek(offset[,whence]):將柳位置更改爲給定的字節偏移量(offset),whence爲偏移量指示位置,默認爲SEEK_SET即0流的開始位置,必須爲0或者正整數,SEEK_CUR或1爲當前流位置,SEEK_END或2爲流的結尾。
seekable():如果流支持隨機訪問則返回True否則返回false
tell():返回當前流的位置
truncate(size=None):將流大小調整爲以字節爲單位的給定大小(size),返回新的文件大小
writable():如果流支持寫入則返回true,否則返回false
writelines():寫入流列表,不提供換行符
__del__():銷燬對象,close()方法爲此方法的默認實現
(2)class io.RawIOBase
原始二進制IO的基類,它繼承IOBase,沒有公共構造函數
原始二進制IO通常提供對底層操作系統設備或API的低級別訪問。
除了IOBase提供的屬性和方法外,RawIOBase還提供了以下方法:
read(size=-1):從對象中讀取size指定大小的字節並返回,如果size未指定或爲-1則返回EOF之前的所有字節,如果對象爲非阻塞且沒有讀取字節則返回None
readall():讀取並返回流中的所有字節
readinto(b):將字節讀入預先分配的可寫類字節對象b,並返回讀取的字節數,讀取 完返回None
write(b):寫入給定類字節對象b,並返回寫入字節的數目
(3)class io.BufferedIOBase
支持以緩衝的二進制流的基類,它繼承IOBase,沒有公共構造函數。
它與RawIOBase的區別在於方法read(),readinto()和write(),都將嘗試讀取儘可能多的輸入或者消耗所有給定的輸出,會造成多次系統調用。
BufferedIOBase繼承或覆蓋IOBase的屬性和方法:
detache():將底層原始流從緩衝區分離出來並返回,在原始流被分離後,緩衝區處於不可用狀態。
4、文本IO
文本IO所產生的是str對象,如果後備存儲本身使用的是字節組成,可以通過編碼和解碼數據來適應平臺數據類型。
文件和內存文本流的創建方法:
import io #文件創建文本流 f = open('myfile.txt','r',encoding='utf-8') #內存中的文本流可以使用StringIO對象來創建 f1 = io.StringIO("some initial text datal") print(f1.getvalue()) #讀取文本流信息
(1)class io.TextIOBase
文本流的基類,這個類提供了一個基於字符和行的接口流IO,沒有readinto()方法,因爲python的字符串是不可變的,它繼承IOBase
TextIOBase繼承或覆蓋了IOBase的屬性和方法外,還提供了以下方法和屬性:
encoding:用於將流的字節解碼爲字符串
errors:解碼器或編碼器的錯誤設置
newlines:表示翻譯的換行符或一個字符串或一個字符串元祖
buffer:基本的二進制緩衝區
detach():分離底層二進制緩衝區TextIOBase並將其返回,StringIO沒有底層緩衝的概念
read():從流中讀取並返回最多size大小的字符作爲單個字符str
readline(size=-1):讀取一行或EOF返回一個str
seek(offset[,whence]):改變流位置的偏移量
tell():返回當前的流位置
write(s):將字符串s寫入流並返回寫入的字符數
(2)class io.TextIOWrapper(buffer,encoding=None,errors=None,newline=None,line_buffering=False,write_through=False)
一個BufferedIOBase二進制流緩衝的文本流,它繼承TextIOBase
newline換行符控制行結束的處理方式
TextIOWrapper繼承了TextIOBase的屬性,還提供:
line_buffering:線路緩衝是否啓用
(3)class io.StringIO(initial_value='',NEWLINE='\n')
用於文本IO在內存中的流,close()調用,文本緩衝將被丟棄
緩衝區的初始化值可以通過initial_value來設置,如果啓用了換行符則換行符將被編碼。該流位於緩衝區的開始處。
StringIO除了繼承TextIOBase的方法外,還提供了此方法:
getvalue():返回一個str包含緩衝區的全部內容,換行符被解碼
5、二進制IO
二進制IO也稱爲緩衝IO需要類似字節的對象並生成bytes對象,不執行編碼,解碼或換行,這種類型的流可以用於非文本數據,並且還需要手動控制文本數據的處理。
創建二進制流的方法:
import io #通過文本創建二進制流可以使用‘b’的模式字符串 #f_b = open("myfile.jpg",'rb') #通過內存創建二進制流可以使用io的BytesIO方法 f_b_m = io.BytesIO(b"some initial binary data:\x00\x01") print(f_b_m.getvalue())
緩衝IO流爲I/O設備提供了比原始IO更高級級別的接口。
(1)class io.BytesIO([initial_bytes])
使用內存中字節緩衝區的流,它繼承BufferedIOBase,close()方法別調用時,緩衝被丟棄,可選參數initial_bytes是一個類似字節的對象,他包含初始數據。
BytesIO繼承和覆蓋BufferedIOBase和IOBase的方法,還提供以下方法:
getbuffer():在緩衝區的內容上返回一個可讀寫的試圖,另外改變視圖將透明的更新緩衝區的內容。
import io
b = io.BytesIO(b'abcdef')
view = b.getbuffer()
view[2:4] = b'56'
print(b.getvalue())
#out
b'ab56ef'
getvalue():返回bytes包含緩衝區的全部內容
(2)class io.BufferedReader(raw,buffer_size=DEFAULT_BUFFER_SIZE)
緩衝區提供對可讀,順序RawIOBase對象的更高級訪問,它繼承BufferedIOBase,從對象讀取數據時,會從基礎的原始數據流請求更大的數據,並將其保存在內存緩衝區中,緩存的數據可以直接讀取返回。
BufferedReader爲給定的可讀原始流和buffer_size創建一個構造函數,如果buffer_size被忽略,則使用DEFAULT_BUFFER_SIZE
BufferedReader除了繼承和覆蓋BufferedIOBase和IOBase的方法外,還提供以下方法:
peek([size]):返回流中的字節而不推進位置,對原始流最多進行一次讀取。
read([size]):讀取並返回size字節,如果未給出size將直到EOF或讀取調用將在非阻塞模式下阻塞。
read1(size):只在原始流上調用一次,返回size字節,否則創建一個原始流讀取調用。
(3)class io.BufferedWriter(raw,buffer_size=DEFAULT_BUFFER_SIZE)
提供對可寫入,順序RawIOBase對象的更高級別訪問的緩衝區,它繼承BufferedIOBase,寫入對象時,通常將數據放入內部緩衝區中,緩衝區將RawIOBase在各種條件下寫入到底層對象,包括flush()被調用,seek()被請求時,當ufferedWriter被關閉時.
ufferedWriter爲給定的可寫raw原始流創建一個構造函數,如果沒有給出buffer_size則默認爲DEFAULT_BUFFER_SIZE
ufferedWriter繼承和覆蓋BufferedIOBase和IOBase的方法外,還提供了以下方法:
flush():強制緩衝區中字節流保存到原始流
write(b):寫入字節對象b並返回寫入的字節數
(4)class io.BufferedRandom(raw,buffer_size=DEFAULT_BUFFER_SIZE)
隨機訪問流的緩衝接口,它繼承BufferedReader和BufferedWriter進一步的支持seek()和tell()功能.
BufferedRandom爲第一個參數中給出的可搜索原始流創建一個讀取器和寫入器的構造函數,如果沒有給出buffer_size則默認爲DEFAULT_BUFFER_SIZE
BufferedRandom繼承了BufferedReader和BufferedWriter的所有屬性和方法
(5)class io.BufferedRWPair(reader,writer,buffer_size=DEFAULT_BUFFER_SIZE)
一個緩衝IO對象,將兩個單向RawIOBase對象(一個可讀,一個可寫)組合爲單個雙向端點,它繼承BufferedIOBase
reader爲可讀對象;writer爲可寫對象.
BufferedRWPair繼承了BufferedIOBase的所有方法,除了detach()
6、原始IO
原始IO也稱爲無緩衝IO通常用作二進制和文本流的低級構建塊,可從用戶代碼直接操作原始流,也可以通過在緩衝禁用的情況下以二進制模式打開文件來創建原始流:
import io f_raw = open("54.jpg",'rb',buffering=0) #buffering選項設置爲0禁止緩衝使用 print(type(f_raw)) #class '_io.FileIO'是一個IO類對象
class io.FileIO(name,mode='r',closefd=True,opener=None)
FileIO表示包含字節數據的OS級文件,它實現了RawIOBase接口和IOBase接口
name:可以值有兩種選擇,bytes表示將要打開的文件的路徑的字符串或對象,但closefd必須是true,否則會引發異常;另一種爲一個整數,表示生成的FileIO對象將訪問的現有OS級文件描述符的編號。
mode:可以爲'r','w','x'或'a',如果文件在打開或寫入是不存在則會被創建,它會在被寫入時截斷。
它繼承IOBase和RawIOBase的屬性和方法,FileIO還提供了以下數據屬性:
mode :在構造函數中給出的模式
name :文件名稱,這是在構造函數中沒有給出名稱事該文件的文件描述符。
-----------------------------------------------------------------------------------------------------end