在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Python/ <code>open</code>函數(shù)
<code>open</code>函數(shù)
Python 2系列版本
可迭代對象(Iterable)
異常
在函數(shù)中嵌入裝飾器
你的第一個裝飾器
上下文管理器(Context managers)
<code>set</code>(集合)數(shù)據(jù)結(jié)構(gòu)
裝飾器類
字典推導(dǎo)式(<code>dict</code> comprehensions)
<code>Reduce</code>
捐贈名單
<code>Filter</code>
<code>try/else</code>從句
*args 的用法
<code>dir</code>
處理異常
<code>else</code>從句
對象自省
For - Else
18. 一行式
Python 3.2及以后版本
Global和Return
基于類的實現(xiàn)
容器(<code>Collections</code>)
23. 協(xié)程
推薦閱讀
譯者后記
<code>*args</code> 和 <code>**kwargs</code>
**kwargs 的用法
生成器(Generators)
迭代(Iteration)
基于生成器的實現(xiàn)
將函數(shù)作為參數(shù)傳給另一個函數(shù)
日志(Logging)
三元運算符
<code>inspect</code>模塊
枚舉
Map,F(xiàn)ilter 和 Reduce
各種推導(dǎo)式(comprehensions)
從函數(shù)中返回函數(shù)
列表推導(dǎo)式(<code>list</code> comprehensions)
處理多個異常
帶參數(shù)的裝飾器
對象變動(Mutation)
22. 目標Python2+3
迭代器(Iterator)
虛擬環(huán)境(virtualenv)
<code>__slots__</code>魔法
什么時候使用它們?
Python/C API
<code>Map</code>
SWIG
授權(quán)(Authorization)
裝飾器
一切皆對象
使用C擴展
使用 <code>*args</code> 和 <code>**kwargs</code> 來調(diào)用函數(shù)
17. <code>lambda</code>表達式
集合推導(dǎo)式(<code>set</code> comprehensions)
<code>type</code>和<code>id</code>
在函數(shù)中定義函數(shù)
<code>finally</code>從句
CTypes
調(diào)試(Debugging)
使用場景
生成器(Generators)
多個return值
關(guān)于原作者
函數(shù)緩存 (Function caching)
Python進階

<code>open</code>函數(shù)

open 函數(shù)可以打開一個文件。超級簡單吧?大多數(shù)時候,我們看到它這樣被使用:

f = open('photo.jpg', 'r+')
jpgdata = f.read()
f.close()

我現(xiàn)在寫這篇文章的原因,是大部分時間我看到open被這樣使用。有三個錯誤存在于上面的代碼中。你能把它們?nèi)赋鰜韱??如不能,請讀下去。在這篇文章的結(jié)尾,你會知道上面的代碼錯在哪里,而且,更重要的是,你能在自己的代碼里避免這些錯誤?,F(xiàn)在我們從基礎(chǔ)開始:

open的返回值是一個文件句柄,從操作系統(tǒng)托付給你的Python程序。一旦你處理完文件,你會想要歸還這個文件句柄,只有這樣你的程序不會超出一次能打開的文件句柄的數(shù)量上限。

顯式地調(diào)用close關(guān)閉了這個文件句柄,但前提是只有在read成功的情況下。如果有任意異常正好在f = open(...)之后產(chǎn)生,f.close()將不會被調(diào)用(取決于Python解釋器的做法,文件句柄可能還是會被歸還,但那是另外的話題了)。為了確保不管異常是否觸發(fā),文件都能關(guān)閉,我們將其包裹成一個with語句:

with open('photo.jpg', 'r+') as f:
    jpgdata = f.read()

open的第一個參數(shù)是文件名。第二個(mode 打開模式)決定了這個文件如何被打開。

  • 如果你想讀取文件,傳入r
  • 如果你想讀取并寫入文件,傳入r+
  • 如果你想覆蓋寫入文件,傳入w
  • 如果你想在文件末尾附加內(nèi)容,傳入a

雖然有若干個其他的有效的mode字符串,但有可能你將永遠不會使用它們。mode很重要,不僅因為它改變了行為,而且它可能導(dǎo)致權(quán)限錯誤。舉個例子,我們要是在一個寫保護的目錄里打開一個jpg文件, open(.., 'r+')就失敗了。mode可能包含一個擴展字符;讓我們還可以以二進制方式打開文件(你將得到字節(jié)串)或者文本模式(字符串)

一般來說,如果文件格式是由人寫的,那么它更可能是文本模式。jpg圖像文件一般不是人寫的(而且其實不是人直接可讀的),因此你應(yīng)該以二進制模式來打開它們,方法是在mode字符串后加一個b(你可以看看開頭的例子里,正確的方式應(yīng)該是rb)。
如果你以文本模式打開一些東西(比如,加一個t,或者就用r/r+/w/a),你還必須知道要使用哪種編碼。對于計算機來說,所有的文件都是字節(jié),而不是字符。

可惜,在Pyhon 2.x版本里,open不支持顯示地指定編碼。然而,io.open函數(shù)在Python 2.x中和3.x(其中它是open的別名)中都有提供,它能做正確的事。你可以傳入encoding這個關(guān)鍵字參數(shù)來傳入編碼。
如果你不傳入任意編碼,一個系統(tǒng) - 以及Python -指定的默認選項將被選中。你也許被誘惑去依賴這個默認選項,但這個默認選項經(jīng)常是錯誤的,或者默認編碼實際上不能表達文件里的所有字符(這將經(jīng)常發(fā)生在Python 2.x和/或Windows)。
所以去挑選一個編碼吧。utf-8是一個非常好的編碼。當你寫入一個文件,你可以選一個你喜歡的編碼(或者最終讀你文件的程序所喜歡的編碼)。

那你怎么找出正在讀的文件是用哪種編碼寫的呢?好吧,不幸的是,并沒有一個十分簡單的方式來檢測編碼。在不同的編碼中,同樣的字節(jié)可以表示不同,但同樣有效的字符。因此,你必須依賴一個元數(shù)據(jù)(比如,在HTTP頭信息里)來找出編碼。越來越多的是,文件格式將編碼定義成UTF-8。

有了這些基礎(chǔ)知識,我們來寫一個程序,讀取一個文件,檢測它是否是JPG(提示:這些文件頭部以字節(jié)FF D8開始),把對輸入文件的描述寫入一個文本文件。

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 (%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))

我敢肯定,現(xiàn)在你會正確地使用open啦!