python IO模塊


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():將底層原始流從緩沖區分離出來並返回,在原始流被分離后,緩沖區處於不可用狀態。

文本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包含緩沖區的全部內容,換行符被解碼

二進制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()

原始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  :文件名稱,這是在構造函數中沒有給出名稱事該文件的文件描述符。

 

轉載:https://www.cnblogs.com/zhangxinqi/p/9135038.html#_label6


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM