python的open函数百度百科,open函数
open函數(shù)可以打開一個(gè)文件。超級(jí)簡單吧?大多數(shù)時(shí)候,我們看到它這樣被使用:
f = open('photo.jpg', 'r+')
jpgdata = f.read()
f.close()
我現(xiàn)在寫這篇文章的原因,是大部分時(shí)間我看到open被這樣使用。有三個(gè)錯(cuò)誤存在于上面的代碼中。你能把它們?nèi)赋鰜韱?#xff1f;如不能,請(qǐng)讀下去。在這篇文章的結(jié)尾,你會(huì)知道上面的代碼錯(cuò)在哪里,而且,更重要的是,你能在自己的代碼里避免這些錯(cuò)誤。現(xiàn)在我們從基礎(chǔ)開始:
open的返回值是一個(gè)文件句柄,從操作系統(tǒng)托付給你的Python程序。一旦你處理完文件,你會(huì)想要?dú)w還這個(gè)文件句柄,只有這樣你的程序不會(huì)超出一次能打開的文件句柄的數(shù)量上限。
顯式地調(diào)用close關(guān)閉了這個(gè)文件句柄,但前提是只有在read成功的情況下。如果有任意異常正好在f = open(...)之后產(chǎn)生,f.close()將不會(huì)被調(diào)用(取決于Python解釋器的做法,文件句柄可能還是會(huì)被歸還,但那是另外的話題了)。為了確保不管異常是否觸發(fā),文件都能關(guān)閉,我們將其包裹成一個(gè)with語句:
with open('photo.jpg', 'r+') as f:
jpgdata = f.read()
open的第一個(gè)參數(shù)是文件名。第二個(gè)(mode打開模式)決定了這個(gè)文件如何被打開。
如果你想讀取文件,傳入r
如果你想讀取并寫入文件,傳入r+
如果你想覆蓋寫入文件,傳入w
如果你想在文件末尾附加內(nèi)容,傳入a
雖然有若干個(gè)其他的有效的mode字符串,但有可能你將永遠(yuǎn)不會(huì)使用它們。mode很重要,不僅因?yàn)樗淖兞诵袨?#xff0c;而且它可能導(dǎo)致權(quán)限錯(cuò)誤。舉個(gè)例子,我們要是在一個(gè)寫保護(hù)的目錄里打開一個(gè)jpg文件, open(.., 'r+')就失敗了。mode可能包含一個(gè)擴(kuò)展字符;讓我們還可以以二進(jìn)制方式打開文件(你將得到字節(jié)串)或者文本模式(字符串)
一般來說,如果文件格式是由人寫的,那么它更可能是文本模式。jpg圖像文件一般不是人寫的(而且其實(shí)不是人直接可讀的),因此你應(yīng)該以二進(jìn)制模式來打開它們,方法是在mode字符串后加一個(gè)b(你可以看看開頭的例子里,正確的方式應(yīng)該是rb)。
如果你以文本模式打開一些東西(比如,加一個(gè)t,或者就用r/r+/w/a),你還必須知道要使用哪種編碼。對(duì)于計(jì)算機(jī)來說,所有的文件都是字節(jié),而不是字符。
可惜,在Pyhon 2.x版本里,open不支持顯示地指定編碼。然而,io.open函數(shù)在Python 2.x中和3.x(其中它是open的別名)中都有提供,它能做正確的事。你可以傳入encoding這個(gè)關(guān)鍵字參數(shù)來傳入編碼。
如果你不傳入任意編碼,一個(gè)系統(tǒng) - 以及Python -指定的默認(rèn)選項(xiàng)將被選中。你也許被誘惑去依賴這個(gè)默認(rèn)選項(xiàng),但這個(gè)默認(rèn)選項(xiàng)經(jīng)常是錯(cuò)誤的,或者默認(rèn)編碼實(shí)際上不能表達(dá)文件里的所有字符(這將經(jīng)常發(fā)生在Python 2.x和/或Windows)。
所以去挑選一個(gè)編碼吧。utf-8是一個(gè)非常好的編碼。當(dāng)你寫入一個(gè)文件,你可以選一個(gè)你喜歡的編碼(或者最終讀你文件的程序所喜歡的編碼)。
那你怎么找出正在讀的文件是用哪種編碼寫的呢?好吧,不幸的是,并沒有一個(gè)十分簡單的方式來檢測編碼。在不同的編碼中,同樣的字節(jié)可以表示不同,但同樣有效的字符。因此,你必須依賴一個(gè)元數(shù)據(jù)(比如,在HTTP頭信息里)來找出編碼。越來越多的是,文件格式將編碼定義成UTF-8。
有了這些基礎(chǔ)知識(shí),我們來寫一個(gè)程序,讀取一個(gè)文件,檢測它是否是JPG(提示:這些文件頭部以字節(jié)FF D8開始),把對(duì)輸入文件的描述寫入一個(gè)文本文件。
import io
with open('photo.jpg', 'rb') as inf:
jpgdata = inf.read()
if jpgdata.startswith(b'\xff\xd8'):
text = u'This is a JPEG file (%dbytes long)\n'
else:
text = u'This is a random file (%dbytes long)\n'
with io.open('summary.txt', 'w', encoding='utf-8') as outf:
outf.write(text % len(jpgdata))
我敢肯定,現(xiàn)在你會(huì)正確地使用open啦!
總結(jié)
以上是生活随笔為你收集整理的python的open函数百度百科,open函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的重载与覆盖,傻傻分不清!
- 下一篇: java 负数 位移运算_Java中的位