Python文件操作

計算機體系架構

運算器:完成各種算術運算、邏輯運算、出具傳輸等數據加工處理

控制器:控制程序的執行

CPU = 運算器 + 控制器

存儲器:用于記憶程序的數據,內存

輸入設備:將數據或程序輸入到計算機中

輸出設備:將數據或程序的處理結果展示給用戶

文件IO常用操作

open

打開

read

讀取

write

寫入

close

關閉

readline

行讀取

readlines

多行讀取

seek

文件指針操作

tell

指針位置

打開

open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

打開一個文件,返回一個文件對象(流對象)和文件描述符,打開文件失敗,則返回異常

文件訪問的模式有兩種:文本模式、二進制模式,不同模式的操作函數不同,表現的結果也不一樣

open的參數

file:打開或要創建的文件名。不指定路徑,默認在當前路徑下

mode

r

默認模式,只讀打開

w

只寫打開

x

創建并寫入一個新文件

a

寫入打開,文件存在則追加

b

二進制模式

t

默認,文本模式

+

讀寫打開一個文件,給原來只讀、只寫方式打開提供缺失的讀或寫的能力

open默認只讀模式r打開已經存在的文件

r

只讀打開文件,若使用到write方法會拋異常

若文件不存在,則FileNotFoundError

w

只寫打開文件,若read則拋異常

若文件不存在則新建文件

若文件存在,則清空文件內容

x

文件不存在,創建文件并以只寫方式打開

文件存在則FileExistsError

a

文件存在,只寫打開,追加內容

文件不存在,則新建并只寫打開,追加內容

r是只讀,w、x、a都是只寫

w、x、a均可產生新文件,w不管文件存在與否都會生成全新內容的文件;a不管文件存在與否都只能在文件尾部追加;x要求事先文件不存在,只能自己創建

t

文本模式,字符流,將文件的字節按照某種字符編碼理解,按照字符操作。open默認mode為rt

b

二進制模式,字節流,將文件按照字節理解,與字符編碼無關,二進制模式操作時,字節操作使用bytes類型

+

為r、w、a、x提供缺失的讀寫功能,但獲取文件對象依舊按照r、w、a、x自己的特征,不能單獨使用

文件指針

指向當前字節位置

mode=r,指針起始位置在0

mode=a,指針起始位置在EOF

tell():顯示指針當前位置

seek(offset[,whence]):移動文件指針位置。offset表示偏移多少字節,whence從何處開始

文本模式下

whence=0,缺省值,表示從頭開始,offset只能為正整數

whence=1,表示從當前位置開始,offset只能為0

whence=2,表示從EOF開始,offset只能為0

只支持從開頭向后偏移的方式

二進制模式下

whence=0,表示從頭開始,offset只能為正整數

whence=1,表示從當前位置開始,offset可正可負

whence=2,表示從EOF開始,offset可正可負

向后seek可以超界,向前不能超界,會拋異常

buffering:緩沖區

-1表示使用缺省大小的buffer。若為二進制模式,使用io.DEFAULT_BUFFER_SIZE值,默認為4096或8192;若為文本模式,如果是終端設備,則為行緩存方式,如果不是則使用二進制模式的策略

0:只在二進制模式下使用,表示關閉buffer

1:只在文本模式下使用,表示使用行緩存,即見到換行符就flush

>1:大于1的數值用于指定buffer的大小

Buffer緩沖區

一個內存空間,FIFO隊列,只有緩沖區滿了或者達到閾值,數據才會flush到磁盤中

flush():將緩沖區數據寫入磁盤

close():關閉前調用flush()

buffering

作用

buffering=-1

t和b,都是io.DEFAULT_BUFFER_SIZE

buffering=0

t:不支持;b:關閉緩沖區

buffering=1

t:行緩沖,遇到換行符才flush;b:1個字節

Buffering>1

t:io.DEFAULT_BUFFER_SIZE,flush完后把當前字符串寫入磁盤
b:行緩沖,緩沖區的值可以超過io.DEFAULT_BUFFER_SIZE,直到設定的值超出后才會把緩沖區flush

總結

文本模式:一般使用默認緩沖區大小

二進制模式:一個個字節的操作,可以指定buffer的大小

一般默認緩沖區大小是比較好的選擇,一般不調整

一般編程中,明確知道需要寫磁盤的時候,都會手動調用flush,而不是等到自動flush或close的時候

encoding

編碼,僅文本模式使用。None表示使用缺省編碼,和操作系統有關,Windows:GBK、Linux:UTF-8

errors

何種編碼錯誤將被捕獲

None和strict表示有編碼錯誤將拋出ValueError;ignore表示忽略

newline

文本模式中,換行的轉換??梢詾镹one、””、’\r’、’\n’、’\r\n’

讀時,None表示’\r’、’\n’、’\r\n’都被轉換成’\n’;””表示不會自動轉換通用換行符;其他合法字符表示換行符就是指定字符,就會按照指定字符進行分行

寫時,None表示’\n’都會被替換為系統缺省行分隔符os.linesep;’\n’或”表示’\n’不替換;其他合法字符表示’\n’會被替換為指定的字符

closefd

關閉文件描述符,True表示關閉它。False會在文件關閉后保持該描述符,fileobj.fileno()查看

?
?

read

read(size=n):size表示讀取多少個字符或字節,復數或None表示讀取到EOF

readline(size=n)

一行行讀取文件內容,size設置一次讀取行內幾個字符或字節

write

write(s):把字符串s寫入到文件中并返回字符的個數

writelines(lines):將字符串列表寫入到文件

close

flush并關閉文件對象

文件已經關閉,再次關閉沒有任何效果

其他

seekable():是否可seek

readable():是否可讀

writable():是否可寫

closed:是否已經關閉

上下文管理

異常處理

當出現異常的時候,攔截異常

上下文管理

特殊語法,交給解釋器去釋放文件對象

使用with…as關鍵字

上下文管理的語句塊并不會開啟新的作用域

with語句塊執行完的時候,會自動關閉文件對象

?
?

StringIO

io模塊中的類

from io import StringIO

在內存中開辟一個文本模式的buffer,可以像文件對象一樣處理

當close方法被調用時,該buffer會被釋放

操作

getvalue():獲取全部文件內容,和文件指針位置無關

好處

一般磁盤的操作比內存的操作要慢得多,內存足夠的情況下,一般的優化思路是少落地,減少磁盤IO的過程,可以大大提高程序的運行效率

BytesIO

io模塊中的類

from io import BytesIO

在內存中開辟一個二進制模式的buffer,可以像文件對象一樣處理

當close方法調用的時候,該buffer會被釋放

操作

getvalue():獲取全部文件內容,和文件指針位置無關

file-like對象

類文件對象,可以像文件對象一樣處理

socket對象、輸入輸出對象(stdin、stdout)都是類文件對象

原創文章,作者:ZBD20,如若轉載,請注明出處:http://www.www58058.com/97325

(0)
ZBD20ZBD20
上一篇 2018-05-01
下一篇 2018-05-02

相關推薦

欧美性久久久久