天天看點

Python中open方法mode參數一些使用問題Python中檔案打開方法open()中的參數問題

Python中open方法mode參數一些使用問題

  • Python中檔案打開方法
  • open()中的參數問題

Python中檔案打開方法

使用open()方法可以打開檔案,使用方法有兩種:

f = open('E:\Projects\Python\text.txt') #1
     with open('E:\Projects\Python\text.txt') as g:#2
         g.read()
           

兩種方法均可打開text.txt檔案,但第二種會在執行完冒号後的語句(段)後自動執行g.close()方法,而第一種方法需要自己再加一行f.close()代碼才會關閉。

如上代碼有時會報錯,提示路徑下檔案找不到,一般是系統把字元串中的\符号識别成了轉義符,這裡可以在字元串引号前加上r或R讓編譯器識别\為ascii字元,而不是識别為轉義符。例:

with open(r'E:\Projects\Python\text.txt') as g:#将單引号中的\識别為符号
         g.read()
           

open()中的參數問題

實際上,open()方法中實際隐藏了很多參數,如模式mode,緩沖buffering等,這裡隻讨論mode參數的設定問題。

首先,格式為:open(file, mode=‘r’)或者open(file,‘r’)

例子中,模式r代表隻讀;常用的模式見下表:

Mode Meaning
r 隻讀模式
w 寫模式
a 追加寫模式

r:指針在文本最前(0,0),隻能進行讀,不可寫;

w:指針在文本最前(0,0),如果沒有目标文本,會建立一個空目标文本;如果有,會清除目标文本中的所有内容,相當于建立一個空的目标文本後替換原文本;

a:如果有目标文本,指針會跳到文本的最後;如果沒有找到,同w模式會建立一個空的文本。

于是便有一些mode使用方式上的問題,假設我們的text.txt中的文本為This is Reading Text ,使用三種模式,如下面三段代碼:

with open(r'E:\Projects\Python\text.txt','r') as f:
         print(f.read())
           

輸出為:

This is Reading Text
           

而使用‘w’模式:

with open(r'E:\Projects\Python\text.txt','w') as f:
         print(f.read())
           

輸出為:

'a’模式:

with open(r'E:\Projects\Python\text.txt','a') as f:
         print(f.read())
           

輸出為:

可以放到python中實驗,得到’w’和’a’模式下的輸出為空;這是因為’w’模式下會清空文本内容;而’a’模式下,指針在文本的最後,會從目前指針位置開始往後讀;如果想在這種模式下讀取全部的文本,則需要使用seek()方法:

with open(r'E:\Projects\Python\text.txt','a') as f:
         f.seek(0,0)#傳回最前指針
         print(f.read())
           

輸出為:

This is Reading Text
           

此外,還有二進制模式,使用方法一般在模式後面加一個字母b,如’rb’,具體使用方式這裡不提。

+模式,放在三種模式後使用,意義是把單純的隻讀模式、寫模式等改變為可讀寫模式,使用方式為:‘r+’、‘w+’、‘a+’。

帶上+号的三種讀寫模式看似有所差異,實際上除了一開始open()方法有所差異外,在正常的讀寫操作是基本可以說是沒有差異的,關鍵就是指針的位置。我們保持初始文本内容為This is Reading Text ,看下面兩個例子:

with open(r'E:\Projects\Python\text.txt','r+') as f:
         print(f.read())
         f.write("\nThis is Writing Text")
         seek(0,0)
         print(f.read())
           

輸出為:

This is Reading Text This is Reading Text
     This is Writing Text
           

文本中有兩行:

This is Reading Text

This is Writing Text

如果我們删除第一行的print,如下代碼:

with open(r'E:\Projects\Python\text.txt','r+') as f:
         f.write("\nThis is Writing Text")
         seek(0,0)
         print(f.read())
           

輸出為:

This is Writing Text
           

而且文本也可以看到,隻有一行This is Writing Text ,這是因為r+指針在文本的開頭,而寫操作正是從開頭的指針往後寫,覆寫掉了原來的文本;而第一個例子因為執行了read()方法,指針在文本的最後(相當于讀取開始就是采用’a’模式),是以從文本末尾開始寫,便不會覆寫掉原有内容。

歡迎各位發表自己的看法,我也深知自己可能會出現一些錯誤,懇請各位批評指正,互相促進!