引言
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)單政模,多練練就好了