Python基礎(chǔ)文件操作讀寫(xiě)

讀寫(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容