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