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 updatenew1.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在文字的末尾新增了新寫入的內容。上面就是模式w和a的區別,w在開啟檔案的this is test2
this is test3
try to update
時候將指標移動到檔案開頭並截斷(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僅僅是替換了new3.txt原來位置的字元,其他未變!我們再試試w+this is two
this is three
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...