讀寫(xiě)文件是最常見(jiàn)的IO操作。Python內(nèi)置了讀寫(xiě)文件的函數(shù),用法和C是兼容的。
讀寫(xiě)文件前,我們先必須了解一下,在磁盤(pán)上讀寫(xiě)文件的功能都是由操作系統(tǒng)提供的,現(xiàn)代操作系統(tǒng)不允許普通的程序直接操作磁盤(pán),所以,讀寫(xiě)文件就是請(qǐng)求操作系統(tǒng)打開(kāi)一個(gè)文件對(duì)象(通常稱(chēng)為文件描述符),然后,通過(guò)操作系統(tǒng)提供的接口從這個(gè)文件對(duì)象中讀取數(shù)據(jù)(讀文件),或者把數(shù)據(jù)寫(xiě)入這個(gè)文件對(duì)象(寫(xiě)文件)。
一、文件操作流程
- 打開(kāi)文件,得到文件句柄并賦值給一個(gè)變量
- 通過(guò)句柄對(duì)文件進(jìn)行操作
- 關(guān)閉文件(用with語(yǔ)法可免)
二、常規(guī)操作
f = open('file', 'r',encoding='utf-8') //打開(kāi)文件,得到文件句柄賦值給一個(gè)變量
f.read() //調(diào)用read()方法可以一次讀取文件的全部?jī)?nèi)容,Python把內(nèi)容讀到內(nèi)存,class type:str
f.close() //調(diào)用close()方法關(guān)閉文件。文件使用完畢后必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間能打開(kāi)的文件數(shù)量也是有限的
for i in f.readlines(): //readlines方法返回的是list,用python跌代器特性也可遍歷全文
print(i)
read()
<b>調(diào)用read()會(huì)一次性讀取文件的全部?jī)?nèi)容,如果文件有10G,內(nèi)存就爆了,所以,要保險(xiǎn)起見(jiàn),可以反復(fù)調(diào)用read(size)方法,每次最多讀取size個(gè)字節(jié)的內(nèi)容。另外,調(diào)用readline()可以每次讀取一行內(nèi)容,調(diào)用readlines()一次讀取所有內(nèi)容并按行返回list。因此,要根據(jù)需要決定怎么調(diào)用。
讀取總結(jié):如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復(fù)調(diào)用read(size)比較保險(xiǎn);如果是配置文件,調(diào)用readlines()最方便
三、open的打開(kāi)模式
打開(kāi)文件的模式有:
r,只讀模式(默認(rèn))。
w,只寫(xiě)模式?!静豢勺x;不存在則創(chuàng)建;存在則刪除內(nèi)容;】
a,追加模式?!究勺x; 不存在則創(chuàng)建;存在則只追加內(nèi)容;】
"+" 表示可以同時(shí)讀寫(xiě)某個(gè)文件
r+,可讀寫(xiě)文件?!究勺x;可寫(xiě);可追加】
w+,寫(xiě)讀
a+,同a
"U"表示在讀取時(shí),可以將 \r \n \r\n自動(dòng)轉(zhuǎn)換成 \n (與 r 或 r+ 模式同使用)
rU
r+U
"b"表示處理二進(jìn)制文件(如:FTP發(fā)送上傳ISO鏡像文件,linux可忽略,windows處理二進(jìn)制文件時(shí)需標(biāo)注)rb
wb
ab
四、with語(yǔ)句
文件讀寫(xiě)結(jié)束后務(wù)必要調(diào)用f.close()來(lái)關(guān)閉文件。當(dāng)我們寫(xiě)文件時(shí),操作系統(tǒng)往往不會(huì)立刻把數(shù)據(jù)寫(xiě)入磁盤(pán),而是放到內(nèi)存緩存起來(lái),空閑的時(shí)候再慢慢寫(xiě)入。只有調(diào)用close()方法時(shí),操作系統(tǒng)才保證把沒(méi)有寫(xiě)入的數(shù)據(jù)全部寫(xiě)入磁盤(pán)。忘記調(diào)用close()的后果是數(shù)據(jù)可能只寫(xiě)了一部分到磁盤(pán),剩下的丟失了。使用with語(yǔ)句,可避免這樣的錯(cuò)誤
with open('file','w',encoding='utf-8') as f:
f.write('hello world')
五、examples
Tips:python修改文件時(shí),使用w模式會(huì)將原本的文件清空/覆蓋??梢韵扔米x(r)的方式打開(kāi),寫(xiě)到內(nèi)存中,然后再用寫(xiě)(w)的方式打開(kāi)。
需求:實(shí)現(xiàn)sed簡(jiǎn)單替換功能
- 定義一個(gè)函數(shù),帶有4個(gè)參數(shù)
- x 表示要更新的文件名稱(chēng)
- y 表示要被替換的內(nèi)容
- z 表示 替換后的內(nèi)容
- s 默認(rèn)參數(shù)為 1 表示只替換第一個(gè)匹配到的字符串
- 如果參數(shù)為 s = 'g' 則表示全文替換
def file(x,y,z,s=1):
with open(x,'r',encoding='utf-8') as f:
lines = f.readlines()
with open(x,'w',encoding='utf-8') as fw:
n = 0
if s == 1:
for i in lines:
if y in i:
i = i.replace(y,z)
n+=1
break
fw.write(i)
n+=1
for i in range(n,len(lines)):
fw.write(lines[i])
elif s == 'g':
for i in lines:
if y in i :
i = i.replace(y,z)
fw.write(i)
file('文件名','原字符','被替換字符')
六、替換文件的兩種方法
python修改文件時(shí),使用w模式會(huì)將原本的文件清空/覆蓋??梢韵扔米x(r)的方式打開(kāi),寫(xiě)到內(nèi)存中,然后再用寫(xiě)(w)的方式打開(kāi)。
(1)把文件寫(xiě)進(jìn)內(nèi)存之后在修改
with open('file',encoding='utf-8') as f:
lines = f.readlines //寫(xiě)進(jìn)內(nèi)存
with open('file','w',encoding='utf-8') as fw:
pass #將上方lines變量(把文件存儲(chǔ)到內(nèi)存中),寫(xiě)進(jìn)原文件
(2)讀取原文件并將新內(nèi)容寫(xiě)在新文件中
with open('file',encoding='utf-8') as f:
with open('file_new','w',encoding='utf-8') as f_w:
for i in f.readlines():
f_w.write(i)