1. 程式人生 > >python open()函式的模式選擇

python open()函式的模式選擇

ython open()函式開啟檔案的模式詳解

使用python處理檔案時,避免不了要用到open()函式。我們今天主要討論mode引數的區分。

fd = open('檔名(路徑)’, mode=‘模式’)

先放上stockoverflow上一個哥麼做的圖,很清楚的從總體上概括了mode的區分;

圖中展示了幾種主要的模式,r(只讀),r+(讀寫),w(只寫), w+(讀寫), a(追加),a+(追加讀)

從功能上分類:模式r只有讀的功能,模式w和a只有寫的功能,模式r+,w+和a+擁有讀和寫的功能。

讀的功能就是,檔案讀入的物件可以使用read讀取檔案內容,不用使用write方法向寫入內容;寫的功能是反過來的,

可以使用write方法向寫入內容,不用使用read讀取檔案內容,而讀寫就是這兩個功能都有。

說到這裡模式之間的區別還是不清楚。我們可以接著看下面這張圖來進一步認識模式間的區別:

------------------| r   r+   w   w+   a   a+
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start |+    +    +   +
position at end   |                   +   +

1,r和r+的區別

先試著執行下面程式碼:

1 fd1 = open('newfile1.txt', mode='r')
2 fd2 = open('newfile2.txt', mode='r+')

如果你的工作目錄下沒有newfile.txt的話,執行這兩行程式碼會出現FileNotFoundError報錯資訊,告訴

你“本路徑下沒有名叫newfile.txt的這個檔案”,可以先建立一個名為newfile.txt的檔案再執行上面程式碼就不會出問題了,

接著執行:

1 fd1.read()
2 fd2.read()

程式碼正常執行,返回空字串;返回空字串是因為你的檔案裡什麼原本就什麼就沒有

接著執行:

1 fd1.write('this is test')
2 fd2.write('this is test')

第一行程式碼報錯io.UnsupportedOperation: not writable,第二行程式碼正常執行,這裡就是r和r+的區別了

r只有讀的功能,r+既有讀的功能,也有寫的功能。

2,w和w+的區別

複製程式碼

1 fd1 = open('newfile1.txt', mode='w')
2 fd2 = open('newfile2.txt', mode='w+')
3 fd1.write('this is test')
4 fd2.write('this is test')
5 fd1.read()
6 fd2.read()

複製程式碼

與r和r+不同的是,無論當前目錄下有沒有名字為newfile.txt的檔案,第一第二行都會正常執行,如果沒有的話會在當前目錄下建立一個名為newfile.txt的檔案。

第三第四行也會正常執行,並將字串寫入檔案,

第五行會報錯:io.UnsupportedOperation: not readable,第六行會正常執行;這說明w和w+的區別是後者兼有讀寫功能,前這隻有寫的功能。

第六行雖然執行成功了,但是返回的確是空字串,問題是我們在讀取之前已經寫入了內容呀?這

是因為寫入結束之後我們的指標放在檔案的末尾,這時候你讀取的就是末尾之後的東西,也就是空

字串了。可以嘗試一下方法解決:

(1)先關閉檔案再開啟檔案讀取

1 fd2.close()
2 fd2 = open('newfile2.txt', mode='r')
3 fd2.read()

這樣的話會正常顯示我們之前寫入的內容,這個方法未免太“折騰”了

(2)移動指標到檔案開頭再讀取

1 fd2.seek(0)
2 fd2.read()

這樣也可以成功讀取剛寫入的內容,seek(0)中的0表示offset=0,偏移0個字元,還有一個引數whence預設為0代表從檔案開始位置,另外還有1代表當前位置,2代表檔案末尾。

3,a和a+的區別:

模式a和a+之間的區別與w和w+之間的區別相同,在此不做贅述

4,a和w的區別

模式a和w都是寫,區別就在於從哪裡開始寫,為了說明問題,我們先新建立兩個檔案new1.txt和new2.txt內容都為:

this is test1
this is test2
this is test3

然後執行下面程式碼:

1 fd1 = open('new1.txt', mode='w')
2 fd1.write('try to update')
3 fd1.seek(0)
4 fd1.read()

輸出的結果為:

try to update

new1.txt檔案中的原始內容被“沖洗”掉了!,我們再試試追加模式a

1 fd2 = open('new2.txt', mode='a')
2 fd2.write('try to update')
3 fd2.seek(0)
4 fd2.read()

返回的結果為:

this is test1
this is test2
this is test3
try to update

在文字的末尾添加了新寫入的內容。上面就是模式w和a的區別,w在開啟檔案的

時候將指標移動到檔案開頭並截斷(truncate)了之後的所有內容,截斷即刪除掉了。

而模式a開打檔案的時候,其指標的位置是在檔案的末尾。所以寫入新內容的時候

這兩種模式就會不一樣。

值得一提的是,以模式a開啟一個當前目錄下不存在的檔案也同樣會新建立該檔案。

5,r+和w+之間的比較

r+和w+之間是有必要拿出來比較一下的,因為他們的功能還是很像的,先說相同點

(1)都是可讀可寫的

(2)開啟檔案時指標都位於開始位置

再說不同點,建立兩個新檔案new3.txt和new4.txt內容都為:

this is one
this is two
this is three

嘗試以下程式碼:

1 fd3 = open('new3.txt', mode='w+')
2 fd3.write('1234')
3 fd3.seek(0)
4 fd3.read()

返回的結果是:

1234 is one
this is two
this is three

僅僅是替換了new3.txt原來位置的字元,其他未變!我們再試試w+

1 fd4 = open('new4.txt', mode='w+')
2 fd4.write('1234')
3 fd4.seek(0)
4 fd4.read()

返回的結果為:

1234

結果一目瞭然了。