計算機體系架構
運算器:完成各種算術運算、邏輯運算、出具傳輸等數據加工處理
控制器:控制程序的執行
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完后把當前字符串寫入磁盤 |
總結
文本模式:一般使用默認緩沖區大小
二進制模式:一個個字節的操作,可以指定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