Python利用open函數(shù)讀寫(xiě)文件的示例詳解
在目前的環(huán)境中,讀取文件應(yīng)該算是最基本的操作了,python
也內(nèi)置了讀寫(xiě)文件的函數(shù),讓我們來(lái)看下。這里有個(gè)小點(diǎn)要點(diǎn)一下,我們使用python
是沒(méi)法辦直接操作文件的,而是操作系統(tǒng)給我們預(yù)留了接口,python
通過(guò)操作系統(tǒng)接口才能去讀寫(xiě)文件。
還是提及一點(diǎn),編寫(xiě)這篇文章的python
版本為:
最簡(jiǎn)單讀取文件操作
在python
中,直接使用open
方法就可以打開(kāi)文件對(duì)象了。
open
函數(shù)需要傳入的參數(shù)為open(文件名,模式,編碼)
,其中文件名必須要指定文件名。
例如,我們想打開(kāi)files.txt
文件,可以這么寫(xiě):
f = open("files.txt")
這樣的話,我們就得到了一個(gè)文件句柄f
。而直接調(diào)用f.read()
即可讀取所有信息,例如:
我們有個(gè)文件,內(nèi)容如下:
我們可以使用如下代碼進(jìn)行讀取:
f = open("files.txt") print(f.read())
結(jié)果如下:
操作一次文件讀寫(xiě)完整流程
上述代碼簡(jiǎn)單吧,但是也是有缺陷的,在于操作完畢后,沒(méi)有關(guān)閉文件句柄,此操作可能會(huì)引起數(shù)據(jù)丟失,因?yàn)槲覀兊臄?shù)據(jù)不是直接存到磁盤(pán)的,而是寫(xiě)到緩沖器,等量夠了之后,再進(jìn)行寫(xiě)入磁盤(pán)操作。
但是等我們?cè)趫?zhí)行close
操作時(shí),會(huì)強(qiáng)制將緩沖器的內(nèi)容寫(xiě)到磁盤(pán)中去。
所以完整的讀寫(xiě)流程為:
- 使用
open
打開(kāi)文件 - 進(jìn)行讀寫(xiě)操作
- 完畢后需要
close
文件
基本代碼為:
f = open("files.txt") # 文件讀寫(xiě)操作 f.close()
還會(huì)有這樣的一種情況,就是文件讀寫(xiě)過(guò)程中出現(xiàn)異常了,拋錯(cuò),導(dǎo)致文件執(zhí)行不到f.close()
,此時(shí)就沒(méi)辦法做關(guān)閉句柄的動(dòng)作。
這個(gè)時(shí)候,我們就可以使用with open() as f
的方式來(lái)進(jìn)行打開(kāi)文件操作,with
語(yǔ)句會(huì)在底層做關(guān)閉句柄操作,即使觸發(fā)異常,也會(huì)正常關(guān)閉句柄。
文件打開(kāi)方式
還記得第一段落所提及的open
打開(kāi)的模式么? 其實(shí)指的是文件的打開(kāi)方式,默認(rèn)是只讀模式,即: r
,除此之外,還有其他的方式,例如:
r
: 文件以只讀方式打開(kāi)(也是默認(rèn)模式)。w
: 文件以寫(xiě)入方式打開(kāi),會(huì)重置文件。x
: 創(chuàng)建一個(gè)新文件且寫(xiě)入。a
: 追加寫(xiě)入(如果文件存在,會(huì)在末尾進(jìn)行追加)。b
: 文件以二進(jìn)制打開(kāi)。t
: 文件以文本模式打開(kāi)(也是默認(rèn)模式)。+
: 打開(kāi)文件進(jìn)行更新(可讀可寫(xiě))。
上述模式是可以疊加的,例如默認(rèn)的: rt
。
如果模式不正確,則會(huì)拋錯(cuò),例如,我們使用默認(rèn)的rt
打開(kāi)一個(gè)已有文件,進(jìn)行write
寫(xiě)入:
f = open("files.txt","rt") print(f.readline()) f.write("123")
執(zhí)行后發(fā)現(xiàn),其實(shí)f.readline
已經(jīng)執(zhí)行成功了,而f.write
失敗了,報(bào)錯(cuò)為沒(méi)有writeable
。
此時(shí)我們?nèi)魧?quán)限修改為r+
,則就不會(huì)報(bào)錯(cuò),我們?cè)囋嚳?/p>
程序修改為:
f=open("files.txt","r+") print(f.readline()) f.write("123") f.close()
執(zhí)行后查看文件
可以看到123
已經(jīng)追加到文件中了,只不過(guò)沒(méi)有換行。
python提供的讀取方法有何意義
在上述段落中,我們已經(jīng)有了文件句柄f
,關(guān)于讀取有如下幾種方法:
readlines
: 一次性讀取所有行,然后將其按照列表的形式返回。readline
: 每次讀取一行,直至空。read
: 讀取全部數(shù)據(jù)并且返回。
readlines
會(huì)讀取所有的行,并且按照列表的形式返回,例如:
f = open("files.txt","r") print(f.readlines()) f.close()
上述代碼會(huì)將files.txt
全部讀取完,并且按照換行作為分隔符,進(jìn)行拆分?jǐn)?shù)據(jù),并且按照列表的形式進(jìn)行返回。
執(zhí)行后效果為:
而read
則會(huì)讀取全部數(shù)據(jù)并且返回,當(dāng)然了,read
還能接收參數(shù),例如read(10)
就是讀取10個(gè)字節(jié)數(shù)據(jù),默認(rèn)是全部,例如:
f = open("files.txt","r") print(f.read()) f.close()
執(zhí)行后效果為:
對(duì)于readline
來(lái)說(shuō),它會(huì)讀取一行文件,我們可以結(jié)合with
語(yǔ)句來(lái)操作,可以避免close
。如何使用open...with
配合readline
讀取所有的行呢? 可以使用如下代碼實(shí)現(xiàn):
with open("files.txt","r+") as f: while True: line = f.readline() if not line: break print(line)
上述代碼中,我們使用了while True
來(lái)進(jìn)行死循環(huán),將文件讀取完畢后,就退出循環(huán)。
小案例: 掃描redis配置文件
我們將使用python
讀取文件操作,對(duì)redis.conf
進(jìn)行讀取,將排查掉配置文件的空行和注釋行,并且將剔除配置文件之后的配置寫(xiě)入到新文件中newRedis.conf
。
注意: redis
使用#
進(jìn)行注釋配置,例如:
cat redis.conf # 這是注釋 bind 0.0.0.0 # 這也是注釋
由于該配置文件實(shí)在是太長(zhǎng)了,所以,我們隨機(jī)選擇一段進(jìn)行操作:
我們可以先使用寫(xiě)方式打開(kāi)新文件newRedis.conf
,而后使用以只讀方式打開(kāi)redis.conf
,而后逐行掃描,如果遇到空行,或者開(kāi)頭為#
的就直接略過(guò),如果上述2者都不是,則是配置文件,注意配置文件是否包含注釋符號(hào)#
,如果包含的話,需要略過(guò)#
之后的數(shù)據(jù)。
import re def main(): with open("newRedis.cof","w+") as w: with open("redis.cof","r") as f: while True: line=f.readline() if not line: break #去掉行首為#的注釋 if re.match("#",line): pass #去掉空行 elif re.match("^$",line): pass #去掉配置的注釋 else: if '#' in line: s=re.findall("(.*)#".line) w.write(s[0]+"\n") else: w.write(line) if __name__ == '__main__': main()
上述代碼引入了re
庫(kù)進(jìn)行處理,其中match
代表匹配字符串行首,^$
代表空行,而后再在配置文件中判斷#
是否出現(xiàn)在語(yǔ)句中,如果出現(xiàn),再使用元組將第一個(gè)#
配置前的數(shù)據(jù)抓出來(lái)。
最后將抓出的配置寫(xiě)入文件中即可。
執(zhí)行腳本后,查看newRedis.conf
文件
總結(jié)
本篇文章介紹了python
讀寫(xiě)文件,更推薦使用with open
的方式,因?yàn)樗讓訒?huì)調(diào)用close
方法,而不需要我們自己去寫(xiě)調(diào)用close
方法。
最后我們寫(xiě)了一個(gè)小案例來(lái)屏蔽redis
注釋和空行,僅讀取配置文件。
到此這篇關(guān)于Python利用open函數(shù)讀寫(xiě)文件的示例詳解的文章就介紹到這了,更多相關(guān)Python open讀寫(xiě)文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python機(jī)器學(xué)習(xí)之決策樹(shù)分類詳解
這篇文章主要介紹了python機(jī)器學(xué)習(xí)之決策樹(shù)分類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12使用Python編寫(xiě)Prometheus監(jiān)控的方法
今天小編就為大家分享一篇關(guān)于使用Python編寫(xiě)Prometheus監(jiān)控的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10PyTorch中torch.load()的用法和應(yīng)用
torch.load()它用于加載由torch.save()保存的模型或張量,本文主要介紹了PyTorch中torch.load()的用法和應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Python 利用CSV模塊處理數(shù)據(jù)的實(shí)現(xiàn)實(shí)例
CSV文件的一個(gè)主要優(yōu)點(diǎn)是有很多程序可以存儲(chǔ),轉(zhuǎn)換和處理純文本文件,本文主要介紹了Python 利用CSV模塊處理數(shù)據(jù)的實(shí)現(xiàn)實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Postman安裝與使用詳細(xì)教程 附postman離線安裝包
這篇文章主要介紹了Postman安裝與使用詳細(xì)教程 附postman離線安裝包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Flaks基礎(chǔ)之在URL中添加變量的實(shí)現(xiàn)詳解
這篇文章主要介紹了在python開(kāi)發(fā)中,F(xiàn)laks框架之上在URL鏈接中添加變量的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09