1、馮諾依曼體系
Cpu由運算器和控制器組成:
運算器,完成各種算數操作、邏輯運算、數據傳輸等數據加工處理。
控制器,控制程序的執行。
存儲器,用於記憶程序和數據,例如內存。
輸入設備,將數據或者程序輸入到計算機中,例如鍵盤,鼠標。
輸出設備:將計算機處理結果 展示給用戶,例如顯示器,打印機等。
2、一般說IO操作,指的是文件IO,如果指的是網絡IO,那么就是網絡IO操作。
3、文件IO常用操作
column |
column |
open |
打開 |
read |
讀取 |
write |
寫入 |
close |
關閉 |
readline |
行讀取 |
readlines |
多行讀取 |
seek |
文件指針操作 |
tell |
指針位置 |
4、打開操作
Open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
Open 打開一個文件,返回一個文件對象(流對象)和文件描述符,打開文件失敗,返回異常。
基本使用:
f = open('test')
print(f.read())
f.close
文件操作中,最常用的操作就是讀和寫。
文件的訪問模式也有兩種:文本模式和二進制模式。不同模式,函數操作不盡相同,表現的結果也不一樣。
5、poen的參數
1)file:
打開或者創建的文件名,如果不指定路徑,默認是當前路徑。
2)mode模式
描述字符 |
意義 |
r |
缺省的,表示只是打開 |
w |
只是寫入的 |
x |
創建並寫入一個新的文件 |
a |
寫入打開,如果文件存在,則追加 |
t |
缺省的,文本模式 |
+ |
讀寫打開一個文件,給原來只讀、只寫方式打開缺失的讀或者寫的能力 |
3)編碼
Windows下面:GBK CP936
Linux下面是:UTF-8
文件操作中,最常見的就是讀和寫。
文件訪問的模式有兩種:文本模式和二進制模式;不同模式下,函數的執行.
W特性是:沒有的話創建,有的話直接覆蓋。
Open默認是只讀模式r打開已經存在的文件。
4)#基本練習
#只讀的
f = open('test') #等價於 f = open(‘open’,‘r’)
f.read()
# f.write('abc')
f.close()
#只寫
f = open('test','w')
print(f.write('abc'))
f.close()
Print 輸入3,顯示的是輸入的是三個字符。
5)總結
Open模式是只讀模式r打開已經存在的文件。
(1)r
只讀打開文件,如果使用write方法,會拋出異常
如果文件不存在,拋出FileNotFoundError異常
(2)w
表示只寫方式打開,如果讀取則拋出異常。
如果文件不存在,則直接創建文件。
如果文件存在,則清空里面的內容。
(3)x
文件不存在直接創建。
文件存在的話直接拋出異常。
創建新文件是只寫的。
f = open('test2','x')
#print(f.read())
print(f.write('abcd'))
f.close
(4) a
文件存在,只寫打開,追加內容。
文件不存在,創建后,只寫打開,追加內容。
f = open('test1','a')
# print(f.read())
f.write('abcd')
f.close()
(5)r 只讀,wxa都是只寫
wxa 都可以產生新文件;
w不管文件存在與否,都會生成全新內容的文件;
a不管文件是否存在,都能在打開的文件尾部追加;
x 必須要求文件事先不存在,自己造一個新的文件。
(6)文本模式t
字符流,將文件的字節按照某種字符編碼理解,按照字符操作。Open的默認莫得就是rt。
默認都是文本字符。
(7)二進制模式b
字節流,將文件就按照字節理解,與字符編碼無關,二進制模式操作時,字節操作使用beyes類型.
f = open('test1','rb')
s = f.read()
print(type(s))
print(s)
f.close()
控制台輸出:
<class 'bytes'>
b'abcd'
f = open('test3','wb')
s = f.write("中國".encode())
print(s)
f.close()
控制台輸出:
6
(8)+號模式功能
為r、w、a、x提供缺失的讀寫功能,但是,獲取文件對象依舊按照r、w、a、x自己的特征。
+不能單獨使用,可以認定他是為前面的模式做增強功能的。
f = open('test1','r+')
s = f.write('hijkl')
print(f.read())
f.close()
(9)b
里面是二進制字節,,其余是字符
Read(參數列表)
文本模式下指的是字符。
二進制 下指的字節。
6、文件指針
上面的例子中,說明有一個指針。
1) 文件指針,指向當前字節的位置
mode=r,指針起始在0
mode=a,起始位置在EOF
tell()顯示指針所在位置。指的是字節的偏移量。
seek(offset[,whence]) 移動文件指針位置,offest偏移多少字節,whence是指在哪里開始。
2)文本模式下:
Whence為0的時候,文件開頭向后偏移量。Offset只是接受正整數。
為1表示當前位置,offest只接受0
為2的時候表示從EOF開始,offest只接受0
3)二進制模式下:
Whence缺省值0,文件開頭向后偏移,offest只是接受正整數。
為1表示當前位置,offest可以接受正負整數。
為2表示從EOF開始,offest可以接受正負整數。
二進制模式支持任意起點的偏移,從頭、從尾,從中間位置開始,向后seek可以超界,但是向前就不可以,否則拋出異常.
f = open('test2','r+')
print(f.tell())
f.read()
print(f.tell())
f.seek(0)
print(f.read())
中文模式只是支持雙字節便宜否則報錯,因為中文都是雙字節的、
7、buffering緩沖區
-1表示使用缺省大小的buffer,如果是二進制模式,使用io.DEFAULT_BUFFER_SIZE值。默認值4096或者8192.
如果是文本模式,如果是終端設備,是行緩存方式,如果不是,則使用二進制模式的策略。
0只在二進制模式使用,表示關buffer
1只在文本模式使用,表示行緩沖。遇到換行符的時候才flush。
大於1用於指定buffer。
buffer緩沖區:
緩沖區一個內存空間,一般來說是一個FIFO隊列,到緩沖區滿了或者達到閾值,數據才會到flush到磁盤。文本模式下不能關閉buffer。。
當緩沖區滿了就該flush。
flush()將緩沖區數據寫入磁盤。
close()關閉前會調用flush()
io.DEFAULT_BUFFER_SIZE缺省緩沖區大小、字節。
buffering |
|
buffering=-1 |
t和b,都是io.DEFAULT_BUFFER_SIZE |
buffering=0 |
b關閉緩沖區 t不支持 |
buffering=1 |
b就一個字節 t行緩沖,遇到換行符才flush |
Buffering>1 |
B模式表示行緩沖從大小,緩沖的值可以超過io.DEFAULT_BUFFER_SIZE,直到設置的值超出后才把緩沖區flush t 模式,是io.DEFAULT_BUFFER_SIZE |
Buffering=-1 t和b都是size
Buffering=0 b關閉緩沖區 t沒有
Buffering=1 b就一個字節 t行換成,遇到換行符才flush
Buffering>1 b模式表示行緩沖大小。
f = open('test4','w+b')
print(io.DEFAULT_BUFFER_SIZE)
總結:
1、文本模式中,一般都默認使用緩沖區大小。
2、二進制模式。是一個個字節的操作,可以指定buffer的大小。
3、一般來說,默認緩沖區大小就是個比較好的選擇,除非明確知道,否則不調整。
4、一般編程中,明確知道需要寫磁盤了,都會手動調用一次flush,而不是等到自動flush或者close。
8、encoding
:編碼,僅文本模式使用:
None表示缺省編碼。依賴操作系統。Windows、linux下的如下代碼。
Windows下缺省GBK()
Linux下缺省UTF-8
f = open('test2','w')
print(f.write('啊'))
# print(f.read())
f.close()
9、其它參數:
Errors:什么樣的編碼錯誤表示將被捕獲。
None和strict表示有編碼錯誤將拋出valueError異常,ignore表示異常。
10、Newline:
文本模式中,換行的轉換,可以為None、空串””、’\r’、’\n’、’\r\n’
讀時候,None表示’\r’,’\n’,’\r\n’都被轉換為’\n’:”表示不會自動轉換通用換行符,其它合法字符表表示換行符就是指定字符,就會按照指定字符分行。
寫時,none表示’\n’都會被替換為系統缺省行分隔符os.linesep;’\n’或”表示’\n’不替換,其它合法字符表示’\n’會被替換為指定的字符。
11、Closedfd
關閉文件描述符,True表示關閉。False會在文件關閉后保持這個描述符,fileobj.fileno()查看這個特性。
12、Read
Read(size=-1) size表示讀取的多少個字符或者字節,負數或者None表示讀取到EOF
13、行讀取:
Readline(size=-1) 一行行讀取內容,size設置以后就按照要求設置的取幾個字節或者字符。
Readlines(hint=1)
讀取所有行的列表,指定hint()。
14、Write(寫)
把字符串s寫入到文件中並返回字符的個數
Writelines(lines),將字符串列表寫入文件。
15、close
flush並關閉對象。
文件已經關閉,再次關閉沒有任何效果。
16、其它
Seekable()是否可以seek
Readable()是否可讀
Writable()是否可讀
Closed是否已經關閉
17、上下文管理
1)異常處理,當出現異常的時候,攔截異常,但是,因為許多代碼都可能出現OSError異常,不好判斷因為資源限制產生的。
f = open('test')
try:
f.write('abc')
finally:
f.close()
使用finally可以保證打開的文件可以被關閉
2)上下文管理
一種特殊的語法,交給解釋去去釋放文件對象
with open('test') as f:
f.write('abc')
f.closed
f1 = open('test')
with f1:
f1.write('abc')
f.closed
With f:
文件管理就自持上下文管理,在退出with上下的時候,會調用close。
With open(‘test’) as f:
使用with ...as關鍵字。With...as不是函數。上下文管理的語句塊並不會開啟新的作用域。With語句塊執行完的時候,會自動關閉文件對象。
對於類似於文件對象的IO對象,一般來說都需要在不使用的時候關閉、注銷,以釋放資源。
IO被打開的時候,會獲得一個文件描述符,計算機資源是有限的,所以操作系統都會做限制,就是為了保護計算機的資源不要被完全的耗盡,資源是共享的,不是獨占的。
一般情況下,除非特別聲明情況下,不得提高資源的限制值來解決問題。