python open 函式的模式選擇

2021-08-31 18:28:45 字數 4103 閱讀 7328

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
結果一目了然了。

Python open函式用法

open 檔案操作 f open tmp hello w open 路徑 檔名,讀寫模式 讀寫模式 r唯讀,r 讀寫,w新建 會覆蓋原有檔案 a追加,b二進位制檔案.常用模式 如 rb wb r b 等等 讀寫模式的型別有 ru 或 ua 以讀方式開啟,同時提供通用換行符支援 pep 278 w 以...

python open 函式使用

python open 函式用於開啟乙個檔案,建立乙個 file 物件,相關的方法才可以呼叫它進行讀寫。open name mode buffering 1.name 乙個包含了你要訪問的檔名稱的字串值。2.mode mode 決定了開啟檔案的模式 唯讀,寫入,追加等。所有可取值見如下的完全列表。這...

python open 函式 開啟檔案

函式原型為 open name mode buffer 其中name為必須,模式 mode 和緩衝 buffer 為可選。mode 有 r 讀模式 w 寫模式 a 追加方式 b 二進位制方式 讀 寫模式 f open a.txt w f.write hello,f.write iplaypython...