Python利用open函數(shù)讀寫文件的示例詳解
在目前的環(huán)境中,讀取文件應該算是最基本的操作了,python也內置了讀寫文件的函數(shù),讓我們來看下。這里有個小點要點一下,我們使用python是沒法辦直接操作文件的,而是操作系統(tǒng)給我們預留了接口,python通過操作系統(tǒng)接口才能去讀寫文件。
還是提及一點,編寫這篇文章的python版本為:

最簡單讀取文件操作
在python中,直接使用open方法就可以打開文件對象了。
open函數(shù)需要傳入的參數(shù)為open(文件名,模式,編碼),其中文件名必須要指定文件名。
例如,我們想打開files.txt文件,可以這么寫:
f = open("files.txt")
這樣的話,我們就得到了一個文件句柄f。而直接調用f.read()即可讀取所有信息,例如:
我們有個文件,內容如下:

我們可以使用如下代碼進行讀取:
f = open("files.txt")
print(f.read())
結果如下:

操作一次文件讀寫完整流程
上述代碼簡單吧,但是也是有缺陷的,在于操作完畢后,沒有關閉文件句柄,此操作可能會引起數(shù)據(jù)丟失,因為我們的數(shù)據(jù)不是直接存到磁盤的,而是寫到緩沖器,等量夠了之后,再進行寫入磁盤操作。
但是等我們在執(zhí)行close操作時,會強制將緩沖器的內容寫到磁盤中去。
所以完整的讀寫流程為:
- 使用
open打開文件 - 進行讀寫操作
- 完畢后需要
close文件
基本代碼為:
f = open("files.txt")
# 文件讀寫操作
f.close()
還會有這樣的一種情況,就是文件讀寫過程中出現(xiàn)異常了,拋錯,導致文件執(zhí)行不到f.close(),此時就沒辦法做關閉句柄的動作。
這個時候,我們就可以使用with open() as f的方式來進行打開文件操作,with語句會在底層做關閉句柄操作,即使觸發(fā)異常,也會正常關閉句柄。
文件打開方式
還記得第一段落所提及的open打開的模式么? 其實指的是文件的打開方式,默認是只讀模式,即: r,除此之外,還有其他的方式,例如:
r: 文件以只讀方式打開(也是默認模式)。w: 文件以寫入方式打開,會重置文件。x: 創(chuàng)建一個新文件且寫入。a: 追加寫入(如果文件存在,會在末尾進行追加)。b: 文件以二進制打開。t: 文件以文本模式打開(也是默認模式)。+: 打開文件進行更新(可讀可寫)。
上述模式是可以疊加的,例如默認的: rt。
如果模式不正確,則會拋錯,例如,我們使用默認的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。

此時我們若將權限修改為r+,則就不會報錯,我們試試看
程序修改為:
f=open("files.txt","r+")
print(f.readline())
f.write("123")
f.close()執(zhí)行后查看文件

可以看到123已經(jīng)追加到文件中了,只不過沒有換行。
python提供的讀取方法有何意義
在上述段落中,我們已經(jīng)有了文件句柄f,關于讀取有如下幾種方法:
readlines: 一次性讀取所有行,然后將其按照列表的形式返回。readline: 每次讀取一行,直至空。read: 讀取全部數(shù)據(jù)并且返回。
readlines會讀取所有的行,并且按照列表的形式返回,例如:
f = open("files.txt","r")
print(f.readlines())
f.close()
上述代碼會將files.txt全部讀取完,并且按照換行作為分隔符,進行拆分數(shù)據(jù),并且按照列表的形式進行返回。
執(zhí)行后效果為:

而read則會讀取全部數(shù)據(jù)并且返回,當然了,read還能接收參數(shù),例如read(10)就是讀取10個字節(jié)數(shù)據(jù),默認是全部,例如:
f = open("files.txt","r")
print(f.read())
f.close()
執(zhí)行后效果為:

對于readline來說,它會讀取一行文件,我們可以結合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文件

總結
本篇文章介紹了python讀寫文件,更推薦使用with open的方式,因為它底層會調用close方法,而不需要我們自己去寫調用close方法。
最后我們寫了一個小案例來屏蔽redis注釋和空行,僅讀取配置文件。
到此這篇關于Python利用open函數(shù)讀寫文件的示例詳解的文章就介紹到這了,更多相關Python open讀寫文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Python對接OpenAi?API實現(xiàn)智能QQ機器人的方法
這篇文章主要介紹了使用Python對接OpenAi?API實現(xiàn)智能QQ機器人的方法,主要是提供一個方法思路,可以根據(jù)實現(xiàn)代碼延申出更多的解決方法,需要的朋友可以參考下2023-03-03
selenium執(zhí)行js并繞過webdriver監(jiān)測常見方法
這篇文章主要為大家介紹了selenium執(zhí)行js并繞過webdriver監(jiān)測常見方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04

