python open用法


本文主要借鑒與《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) )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM