python學(xué)習(xí)筆記-tip49(io編程--文件讀寫)

引言

python內(nèi)置了讀寫文件的函數(shù)牵触,用法和C語言是兼容的

讀文件--open()函數(shù)

用法:傳入文件名和標(biāo)識(shí)符(r,w)即讀姥宝,寫
示例:

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

這樣茵肃,我們就成功的打開了文件

但是如果這個(gè)文件不存在蒂萎,open()函數(shù)就會(huì)報(bào)出IOError的異常同欠,并且給出錯(cuò)誤碼棍现,和詳細(xì)的信息告訴你文件不存在

如果文件打開成功调煎,我們就可以通過read()的方法,將文件中的內(nèi)容全部讀出來己肮,然后用一個(gè)str對(duì)象表示出來士袄,現(xiàn)在呢,我們看一個(gè)示例

我們?cè)谧烂嫘陆ㄒ粋€(gè)hello.txt的文件朴肺,然后里面輸入內(nèi)容“helloworld”窖剑,我們嘗試讀取一下這個(gè)文件中的數(shù)據(jù)

下面我們來說下關(guān)閉文件的方法 close()

文件打開然后操作完畢之后,必須要對(duì)文件進(jìn)行關(guān)閉戈稿,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源西土,關(guān)閉文件意味著釋放資源,所以我們必須有良好的編程習(xí)慣

    f.close()

由于文件讀寫都有可能出現(xiàn) IOError鞍盗,所以一旦報(bào)錯(cuò)需了,關(guān)閉文件的代碼:
f.close()
有時(shí)候會(huì)無法被調(diào)用到,程序就異常退出般甲。
所以肋乍,為了保證無論是否出錯(cuò),都能保證正常的關(guān)閉文件敷存,我們可以使用try...finally來實(shí)現(xiàn)

  try:
      f=open('Users/guaju/Desktop/hello.txt','r')
      print(f.read())
  finally:
      if f:
         f.close()

這樣寫固然是合理的墓造,但是如果我們頻繁操作文件的話堪伍,這樣寫就有些繁瑣了
python提供了更加合適的方法
with語句來自動(dòng)幫助我們調(diào)用close()方法
請(qǐng)看代碼示例:

    with open('Users/guaju/Desktop/hello/txt','r') as f:
            print(f.read())

這個(gè)寫法實(shí)現(xiàn)的效果和上面的try...finally是一樣的,但是代碼卻異常簡(jiǎn)潔

我們來深究下read()方法

上文中我們知道了觅闽,調(diào)用read()方法帝雇,會(huì)一次性的將文件中的全部信息讀取出來,那么如果文件有10G蛉拙,那么電腦內(nèi)存就爆掉了尸闸,所以為了安全起見,可以反復(fù)調(diào)用

  • read(size)方法孕锄,這樣每次最多讀取size個(gè)字節(jié)的內(nèi)容吮廉。
  • 另外,使用readline() 可以每次讀取文件中的一行內(nèi)容
  • 此外畸肆,使用readlines()可以一次性讀取所有內(nèi)容宦芦,并且按行返回list
    因此要根據(jù)需要,決定什么時(shí)候怎么調(diào)用

經(jīng)驗(yàn)之談

如果文件很小恼除,read()方法是最佳的
如果不能確定文件大小踪旷,那么read(size)來反復(fù)調(diào)用,比較保險(xiǎn)
如果是讀取配置文件豁辉,那么使用readlines()比較合適

下面來說明一下readlines()方法使用小示例

    for line in f.readlines():
         #strip()方法可以把末尾的回車符 ”\n“ 刪掉
         print(line.strip())

file-like Object

就是一種類的類型,有read()方法的對(duì)象舀患,在python中統(tǒng)稱為file-like Object徽级。
這種file-like Object可以是
file文件
內(nèi)存的字節(jié)流
網(wǎng)絡(luò)流
自定義流
等等
file-like Object 不要求從特定類繼承,只要寫個(gè) read() 方法就行了聊浅。

StringIO 是在內(nèi)存中創(chuàng)建的file-like Object,常用作臨時(shí)緩沖餐抢。

二進(jìn)制文件

前面提到的都是讀取的文本文件,而且都是utf-8格式的文本文件低匙,要讀取二進(jìn)制文件
比如圖片旷痕、視頻、音頻等顽冶,用‘rb’模式打開文件即可
比如現(xiàn)在我要打開我桌面上的楊冪的圖片
路徑為:‘Users/guaju/Desktop/ym.jpg’
模式為:‘rb’
那么就這樣書寫代碼就可以了



我們看到讀取到的圖片的信息是16進(jìn)制展示的

其實(shí)原圖是這樣的

字符編碼

要讀取飛utf-8編碼的文本文件的話欺抗,就要給open()傳入encoding的參數(shù),例如讀取GBK編碼的文件强重,我們這么寫

f=open('User/guaju/Desktop/gbkfile.txt','r',encoding='gbk')

當(dāng)然绞呈,我們肯定會(huì)遇到編碼不規(guī)則的文件,那么必然會(huì)遇到UnicodeDecodeError,因?yàn)樵谖谋疚募锌赡軍A雜了一些非法編碼的字符间景。
遇到這種情況佃声,open()函數(shù)還接受一個(gè)errors的參數(shù),表示如果遇到編碼錯(cuò)誤后倘要,如何處理圾亏,當(dāng)然最簡(jiǎn)單的處理方式是忽略

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

寫文件

寫文件和讀文件是一樣的宫蛆,唯一區(qū)別調(diào)用open函數(shù)是饶号,輸入的模式變化,輸入模式變?yōu)?br> ‘w’ 或者是‘wb’,分別表示輸出字符裙椭,或者輸出二進(jìn)制內(nèi)容
此外,“讀”read() 則轉(zhuǎn)化為寫write()
我們來看下示例代碼

      with open('Users/guaju/Desktop/hello2.txt','w') as f1
      f1.write('hello python')
      with open('Users/guaju/Desktop/hello2.txt','r') as f2
      f2.read()    

需要注意的是抄课,程序執(zhí)行完write()方法之后虏两,要輸入的文本或者字節(jié)有時(shí)并不會(huì)真正的完整的輸出到文件中去,而是當(dāng)我們調(diào)用close()方法時(shí)铛只,才會(huì)完成完整的輸出埠胖,所以我們一定不要忘了調(diào)用close()方法。
最好的做法就是我上邊的做法淳玩,使用with語句

當(dāng)然直撤,如果要寫入指定編碼的文件,那么同上放一樣蜕着,給open()方法設(shè)置encoding的配置谋竖,將字符串自動(dòng)轉(zhuǎn)換成為指定的編碼

還有兩點(diǎn)需要注意

  • 如果文件不存在,那么不能直接寫入承匣,需要先創(chuàng)建再進(jìn)行寫入

  • 當(dāng)我們寫文件時(shí)蓖乘,如果傳入的模式是'w'的話,那么如果寫的操作執(zhí)行很多次韧骗,那么文件中的內(nèi)容不會(huì)追加嘉抒,而是會(huì)覆蓋,那么怎么解決這個(gè)問題呢袍暴?
    其實(shí)這個(gè)模式替換成'a'就可以了

我們來簡(jiǎn)單看一個(gè)示例



本例是文件不存在的情況

接下來我們先把文件創(chuàng)建出來些侍,然后重新執(zhí)行一遍


現(xiàn)在大家看到區(qū)別了吧

總結(jié)

用到的函數(shù)有

open()
close()
read()
write()

打開文件的配置常見的有

'r'
'w'
'rb'
'wb'
'a'

配置編碼的方式

encoding='編碼方式'

錯(cuò)誤的處理方式

errors='ignore'

with的使用

with open('文件路徑','打開方式',encoding='編碼方式',errors='處理方法') as f:

不多,很簡(jiǎn)單政模,多練練就好了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岗宣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子淋样,更是在濱河造成了極大的恐慌耗式,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件习蓬,死亡現(xiàn)場(chǎng)離奇詭異纽什,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)躲叼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門芦缰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枫慷,你說我怎么就攤上這事让蕾±斯妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵探孝,是天一觀的道長(zhǎng)笋婿。 經(jīng)常有香客問我,道長(zhǎng)顿颅,這世上最難降的妖魔是什么缸濒? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮粱腻,結(jié)果婚禮上庇配,老公的妹妹穿的比我還像新娘。我一直安慰自己绍些,他們只是感情好捞慌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柬批,像睡著了一般啸澡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氮帐,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天嗅虏,我揣著相機(jī)與錄音,去河邊找鬼揪漩。 笑死旋恼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奄容。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼产徊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昂勒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舟铜,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤戈盈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谆刨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塘娶,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年痊夭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刁岸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡她我,死狀恐怖虹曙,靈堂內(nèi)的尸體忽然破棺而出迫横,到底是詐尸還是另有隱情,我是刑警寧澤酝碳,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布矾踱,位于F島的核電站,受9級(jí)特大地震影響疏哗,放射性物質(zhì)發(fā)生泄漏呛讲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一返奉、第九天 我趴在偏房一處隱蔽的房頂上張望贝搁。 院中可真熱鬧,春花似錦衡瓶、人聲如沸徘公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽关面。三九已至,卻和暖如春十厢,著一層夾襖步出監(jiān)牢的瞬間等太,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工蛮放, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缩抡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓包颁,卻偏偏與公主長(zhǎng)得像瞻想,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娩嚼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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