Python 打開文件钦椭,我用with open

讀文件

要以讀文件的模式打開一個文件對象拧额,使用Python內(nèi)置的open()函數(shù),傳入文件名和標(biāo)示符:

>>> f = open('/Users/michael/test.txt', 'r')

標(biāo)示符'r'表示讀彪腔,這樣侥锦,我們就成功地打開了一個文件。

如果文件不存在德挣,open()函數(shù)就會拋出一個IOError的錯誤恭垦,并且給出錯誤碼和詳細(xì)的信息告訴你文件不存在:

f=open('/Users/michael/notfound.txt', 'r')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'

如果文件打開成功,接下來格嗅,調(diào)用read()方法可以一次讀取文件的全部內(nèi)容番挺,Python把內(nèi)容讀到內(nèi)存,用一個str對象表示

f.read() 
'Hello, world!'

最后一步是調(diào)用close()方法關(guān)閉文件屯掖。文件使用完畢后必須關(guān)閉玄柏,因?yàn)槲募ο髸加貌僮飨到y(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間能打開的文件數(shù)量也是有限的:

f.close()

由于文件讀寫時(shí)都有可能產(chǎn)生IOError贴铜,一旦出錯粪摘,后面的f.close()就不會調(diào)用。所以绍坝,為了保證無論是否出錯都能正確地關(guān)閉文件徘意,我們可以使用try ... finally來實(shí)現(xiàn):

try:
    f = open('/path/to/file', 'r') print(f.read())
finally:
   if f:
        f.close()

但是每次都這么寫實(shí)在太繁瑣,所以陷嘴,Python引入了with語句來自動幫我們調(diào)用close()方法:

with open('/path/to/file', 'r') as f: print(f.read())

這和前面的try ... finally是一樣的,但是代碼更佳簡潔间坐,并且不必調(diào)用f.close()方法灾挨。

調(diào)用read()會一次性讀取文件的全部內(nèi)容邑退,如果文件有10G,內(nèi)存就爆了劳澄,所以,要保險(xiǎn)起見秒拔,可以反復(fù)調(diào)用read(size)方法,每次最多讀取size個字節(jié)的內(nèi)容砂缩。另外,調(diào)用readline()可以每次讀取一行內(nèi)容庵芭,調(diào)用readlines()一次讀取所有內(nèi)容并按行返回list妹懒。因此,要根據(jù)需要決定怎么調(diào)用双吆。

如果文件很小,read()一次性讀取最方便匾竿;如果不能確定文件大小,反復(fù)調(diào)用read(size)比較保險(xiǎn)蔚万;如果是配置文件岭妖,調(diào)用readlines()最方便:

for line in f.readlines(): print(line.strip()) # 把末尾的'\n'刪掉

寫文件

寫文件和讀文件是一樣的,唯一區(qū)別是調(diào)用open()函數(shù)時(shí)笛坦,傳入標(biāo)識符'w'或者'wb'表示寫文本文件或?qū)懚M(jìn)制文件:

 f = open('/Users/michael/test.txt', 'w') 
>>> f.write('Hello, world!') 
>>> f.close()

你可以反復(fù)調(diào)用write()來寫入文件区转,但是務(wù)必要調(diào)用f.close()來關(guān)閉文件版扩。當(dāng)我們寫文件時(shí),操作系統(tǒng)往往不會立刻把數(shù)據(jù)寫入磁盤礁芦,而是放到內(nèi)存緩存起來,空閑的時(shí)候再慢慢寫入肖方。只有調(diào)用close()方法時(shí),操作系統(tǒng)才保證把沒有寫入的數(shù)據(jù)全部寫入磁盤俯画。忘記調(diào)用close()的后果是數(shù)據(jù)可能只寫了一部分到磁盤,剩下的丟失了艰垂。所以,還是用with語句來得保險(xiǎn):

with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

要寫入特定編碼的文本文件猜憎,請給open()函數(shù)傳入encoding參數(shù),將字符串自動轉(zhuǎn)換成指定編碼

字符編碼

要讀取非UTF-8編碼的文本文件胰柑,需要給open()函數(shù)傳入encoding參數(shù),例如崩瓤,讀取GBK編碼的文件:

 f = open('/Users/michael/gbk.txt', 'r', encoding='gbk') 
>>> f.read() '測試'

遇到有些編碼不規(guī)范的文件姐浮,你可能會遇到UnicodeDecodeError谷遂,因?yàn)樵谖谋疚募锌赡軍A雜了一些非法編碼的字符卖鲤。遇到這種情況,open()函數(shù)還接收一個errors參數(shù)蛋逾,表示如果遇到編碼錯誤后如何處理。最簡單的方式是直接忽略:

 f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

二進(jìn)制文件

前面講的默認(rèn)都是讀取文本文件偷拔,并且是UTF-8編碼的文本文件。要讀取二進(jìn)制文件,比如圖片、視頻等等吼畏,用'rb'模式打開文件即可:

 f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六進(jìn)制表示的字節(jié)

總結(jié):以后讀寫文件都使用with open語句蛤签,不要再像以前那樣用f = open()這種語句了

對于多個文件的讀寫栅哀,可以寫成以下兩種方式:

    with open('/home/xbwang/Desktop/output_measures2.txt','r') as f1:
        with open('/home/xbwang/Desktop/output_output_bk.txt','r') as f2:
       ........
       ........
       ........
with open('/home/xbwang/Desktop/output_measures.txt','r') as f:
........
with open('/home/xbwang/Desktop/output_measures2.txt','r') as f1:
........
with open('/home/xbwang/Desktop/output_output_bk.txt','r') as f2:
........

文章參考自python文件讀寫,以后就用with open語句

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末留拾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痴柔,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸿捧,死亡現(xiàn)場離奇詭異疙渣,居然都是意外死亡堆巧,警方通過查閱死者的電腦和手機(jī)妄荔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門啦租,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荒揣,“玉大人篷角,你說我怎么就攤上這事系任。” “怎么了俩滥?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵霜旧,是天一觀的道長错忱。 經(jīng)常有香客問我挂据,道長,這世上最難降的妖魔是什么崎逃? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任婚脱,我火速辦了婚禮今魔,結(jié)果婚禮上障贸,老公的妹妹穿的比我還像新娘。我一直安慰自己篮洁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布瓦阐。 她就那樣靜靜地躺著,像睡著了一般睡蟋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戳杀,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音隔缀,去河邊找鬼傍菇。 笑死猾瘸,一個胖子當(dāng)著我的面吹牛丢习,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咐低,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼渊鞋,長吁一口氣:“原來是場噩夢啊……” “哼绰更!你這毒婦竟也來了锡宋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤徐钠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尝丐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衡奥,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年失息,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盹兢。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绎秒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情见芹,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站惠赫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏儿咱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一怠缸、第九天 我趴在偏房一處隱蔽的房頂上張望钳宪。 院中可真熱鬧,春花似錦吏颖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缩多。三九已至,卻和暖如春梁钾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陈轿。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麦射,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓蛔琅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罗售。 傳聞我的和親對象是個殘疾皇子钩述,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 我喜歡你的時(shí)候 趁著朝陽正好 走到你的身邊 對你說聲早上好 然后自然地走在你身旁 我喜歡你的時(shí)候 我的眼光就放在你...
    牧清晚閱讀 333評論 0 1
  • 少女坐在一個高高商業(yè)樓的霓虹燈架上 底下是穿梭的汽車,好像一個個流星劃過 夜里职恳,風(fēng)有些冷 月亮在云層中若隱若現(xiàn) 仿...
    花前癡夢閱讀 115評論 0 0
  • 第一卷 引子 我用三世夙緣方面,償你三千年顧憐 碧落人間放钦,玉骨塵煙 一曲長明恭金,寄我神思素箋 兩行相思,染就暮色霜...
    Ritachenn閱讀 428評論 2 4
  • 個人感悟: 當(dāng)我需要理解別人的時(shí)候邢锯,我需要傾聽【他的頻道】; 當(dāng)我需要維護(hù)自己的立場時(shí)丹擎,我需要堅(jiān)守【我的頻道】; ...
    OneWing閱讀 125評論 0 0