Python中文件IO操作


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被打開的時候,會獲得一個文件描述符,計算機資源是有限的,所以操作系統都會做限制,就是為了保護計算機的資源不要被完全的耗盡,資源是共享的,不是獨占的。

一般情況下,除非特別聲明情況下,不得提高資源的限制值來解決問題。

 


免責聲明!

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



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