open文件操做之mode模式剖析

Python可使用open函數來實現文件的打開,關閉,讀寫操做;python

Python3中的open函數定義爲:json

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

其中mode列表爲:app

'r'       #open for reading (default)
'w'       #open for writing, truncating the file first
'x'       #create a new file and open it for writing,python3新增
'a'       #open for writing, appending to the end of the file if it exists
'b'       #binary mode
't'       #text mode (default),python3新增
'+'       #open a disk file for updating (reading and writing)
'U'       #universal newline mode (deprecated)

這裏咱們主要關心一下'r', 'w', 'a', 'r+', 'w+', 'a+', 'x',不少人容易混淆不一樣模式的讀寫操做ide

1)'r'函數

只讀模式,open函數中mode參數的默認模式,文件不存在的話,報FileNotFoundError(python2是IOError);ui

文件打開後,初始遊標位置爲0;spa

每次讀都是從遊標位置開始讀;3d

若是進行了寫操做,會報以下異常:code

io.UnsupportedOperation: not writable

2)'w'blog

只寫模式,文件不存在的話,建立文件;文件存在的話,首先清空文件,而後開始寫;

文件打開後,初始遊標位置爲0;

每次寫都是從遊標位置開始寫;

若是進行了讀操做,首先文件也會被清空,會報以下異常:

io.UnsupportedOperation: not readable

3)‘a’

追加模式,文件不存在話,建立文件;文件存在的話,不會清空文件;

文件打開後,初始遊標位置爲文件結尾;

每次寫都是從結尾開始寫;

若是進行了讀操做,同時報以下異常:

io.UnsupportedOperation: not readable

上面的比較好理解,下面就有點繞了

4)'r+'

讀寫模式,文件不存在的話,報FileNotFoundError(python2是IOError);

文件打開後,初始遊標位置爲0;

每次讀寫都是從遊標位置開始;可是對於寫操做,相似於替換操做;

看以下代碼:

文件內容爲:

abcdefg

代碼內容爲:

f = open('open_mode.txt', 'r+')
f.write('xyz')
f.close()

運行代碼後,文件內容變爲:

xyzdefg

5)'w+'

只寫模式,文件不存在的話,建立文件;文件存在的話,首先清空文件;

文件打開後,初始遊標位置爲0;

每次讀寫都是從遊標位置開始;寫操做,相似於替換操做;

6)‘a+’

追加模式,文件不存在話,建立文件;文件存在的話,不會清空文件;

文件打開後,初始遊標位置爲文件結尾;

每次寫都是從結尾開始寫;

讀操做從遊標位置開始;

7) 'x'

python3新加

建立文件並寫操做,操做必須是不存在的文件,若是操做的文件已存在,則報錯FileExistsError

不可讀,若是進行了讀操做,同時報以下異常:

io.UnsupportedOperation: not readable

 

最後畫一張表格總結一下:

 

8)'b'

二進制形式讀寫文件;

寫數據時,寫入的數據類型必須爲字符串類型,其餘類型必須經過json(就是符合json格式的字符串)寫入

python2與python3對於'b’ mode的行爲不一樣,這和python2與python3的字符串類型有關;事實上,python的字符串類型有兩種;

Python2的兩種字符串類型,分別叫作str和Unicode,str實例包含原始的8位值;而unicode的實例,則包含Unicode字符。

Python2的兩種字符串類型,分別叫作byte和str,與python2不一樣的是,byte實例包含原始的8位值;而str的實例,則包含Unicode字符。

當讀寫文件採用'b'的模式時,要求必須以二進制形式讀寫,在python2中,字符串必須爲str字符串,python3中必須爲byte字符串;因此在python3,'b'模式下這樣讀寫字符串

s = b'hello world!'    #注意是byte字符串
f = open('open_mode.txt','wb')
f.write(s)
View Code

或:

s = 'hello world!'
f = open('open_mode.txt','wb')
f.write(s.encode(encoding='utf-8'))
View Code

否則會報以下錯誤:

Traceback (most recent call last):
  File "C:/Users/Desktop/Python/cnblogs/數據類型.py", line 125, in <module>
    f.write(s)
TypeError: a bytes-like object is required, not 'str'
View Code

 

 

open的內容還有不少,針對於讀,還有個更好的模塊linecache用於讀取大文件;之後有時間繼續擴展

相關文章
相關標籤/搜索