python open用法
阿新 • • 發佈:2019-01-05
本文主要借鑑與《python進階》這一書
open函式可以開啟一一個檔案。超級簡單吧?大多數時候,我們看到它這樣被使用: f = open('photo.jpg', 'r+') jpgdata = f.read() f.close () 有三個錯誤存在於上面的程式碼中。你能把它們全指出來嗎?
如不能,請讀下去。在這篇文章的結尾,你會知道上面的程式碼錯在哪裡,而且,更重要的是,你能在自己的程式碼裡避免這些錯誤。現在我們 從基礎開始: open的返回值是一個檔案控制代碼,從作業系統託付給你的Python程式。一- 旦你處理完檔案, 你會想要歸還這個檔案控制代碼,只有這樣你的程式不會超出一- 次能開啟的檔案控制代碼的數量上 限。 顯式地呼叫close關閉了這個檔案控制代碼,但前提是隻有在read成功的情況下。如果有任意: 異常正好在f= open(.. .)之後產生,f.close()將不會被呼叫(取決 於Python直譯器 的做法,檔案控制代碼可能還是會被歸還,但那是另外的話題了)。為了確保不管異常是否觸 發,檔案都能關閉,我們將其包裹成一個with 語句:
with open ( 'photo. jpg',' r+') as f: jpgdata = f.read() open的第一個引數是檔名。第二個(mode開啟模式)決定了這個檔案如何被開啟。 ●如果你想讀取檔案,傳入r ●如果你想讀取並寫入檔案,傳入r+ ●如果你想覆蓋寫入檔案,傳入w ●如果你想在檔案末尾附加內容,傳入a
想了解更多,可以百度一下,你會收穫滿滿
雖然有若千個其他的有效的mode字串,但有可能你將永遠不會使用它們。mode很重 要,不僅因為它改變了行為,而且它可能導致許可權錯誤。舉個例子,我們要是在一一個寫保. 護的目錄裡開啟-一個jpg檔案, open(..,'r+' )就失敗了。mode可能包含-一個擴充套件字元;讓我們還可以以二進位制方式開啟檔案(你將得到位元組串)或者文字模式(字串) 一般來說,如果檔案格式是由人寫的,那麼它更可能是文字模式。jpg影象檔案一般不是 人寫的(而且其實不是人直接可讀的),因此你應該以二進位制模式來開啟它們,方法是 在mode字串後加一個b(你可以看看開頭的例子裡,正確的方式應該是rb)。 如果你以文字模式開啟一-些東西(比如,加一個t,或者就用r/r+/w/a),你還必須知道 要使用哪種編碼。對於計算機來說,所有的問題件都是位元組,而不是字元。 可惜,在Pyhon 2.x版本里,open不 支援顯示地指定編碼。然而,io.open 函式在Python 2.x 中和3.x(其中它是open的別名)中都有提供,它能做正確的事。你可以傳入encoding這個 關鍵字引數來傳入編碼。
如果你不傳入任意編碼,一個系統-以及Python-指定的預設選項將被選中。你也許被誘惑 去依賴這個預設選項,但這個預設選項經常是錯誤的,或者預設編碼實際_上不能表達檔案 裡的所有字元(這將經常發生在Python 2.x和/或Windows)。 所以去挑選一一個編碼吧。utf-8是- 個非常好的編碼。當你寫入一個檔案,你可以選一一個 你喜歡的編碼( 或者最終讀你檔案的程式所喜歡的編碼)。 那你怎麼找出正在讀的檔案是用哪種編碼寫的呢?好吧,不幸的是,並沒有一個十分簡單 的方式來檢測編碼。在不同的編碼中,同樣的位元組可以表示不同,但同樣有效的字元。因 此,你必須依賴一一個 元資料(比如, 在HTTP頭資訊裡)來找出編碼。越來越多的是,文 件格式將編碼定義成UTF-8。 有了這些基礎知識,我們來寫一一個程式,讀取一一個檔案,檢測它是否是JPG (提示:這些 檔案頭部以位元組FE D8開始),把對輸入檔案的描述寫入一個文字檔案。
import io with open( 'photo.jpg', 'rb') as inf: jpgdata = inf .read() if jpgdata. startswith (b' xffxd8') : text = u'This is a JPEG file (%d bytes long)\n' else : text = u'This is a random file (%d bytes long)\n' with io.open ( ' summary. txt', 'w' , encoding= 'utf-8') as outf : outf.write(text % len(jpgdata) )