Python(day5)文件操作
一、文件處理流程
- 打開文件,得到文件句柄並賦值給一個變量
- 通過句柄對文件進行操作
- 關閉文件
二、文件打開模式
打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此文件句柄對該文件操作。
打開文件的模式有:
- r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
- w,只寫模式【不可讀;不存在則創建;存在則清空內容】
- x, 只寫模式【不可讀;不存在則創建,存在則報錯】
- a, 追加模式【可讀; 不存在則創建;存在則只追加內容】
"+" 表示可以同時讀寫某個文件
- r+, 讀寫【可讀,可寫】
- w+,寫讀【可讀,可寫】
- x+ ,寫讀【可讀,可寫】
- a+, 寫讀【可讀,可寫】
"b"表示以字節的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
註:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼
#r模式,默認模式,文不存在則報錯 1) f=open(‘a.txt‘,encoding=‘utf-8‘) print(‘first-read:‘,f.read()) #讀文件所有內容 print(‘seconde-read: ‘,f.read()) #光標在最後一行,第二個打印讀不出內容 2) f=open(‘a.txt‘,encoding=‘utf-8‘) print(f.readline(),end=‘‘) #讀文件一行 print(f.readline(),end=‘‘) print(f.readlines()) #讀出文件所有行 f.close() #關閉文件
#w模式,文不存在則創建,文件存在則覆蓋 f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘) f.write(‘1111111\n22222\n3333\n‘) #\n是換行 #也可以這樣寫 f.writelines([‘111hhh\n‘,‘222aa2\n‘,‘3333\n‘]) f.close()
#a模式,文不存在則創建,文件存在不會覆蓋,寫內容是追加的方式寫 f=open(‘a.txt‘,‘a‘,encoding=‘utf-8‘) f.write(‘\n444444\n‘) f.write(‘5555555\n‘) f.close()
#其他方法 # f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘) # f.write(‘asdfasdf‘) # f.flush() #把內存數據刷到硬盤 # f.close() # print(f.closed) #判斷文件是否關閉 # f.readlines()
三、文件內置函數flush
flush原理:
- 文件操作是通過軟件將文件從硬盤讀到內存
- 寫入文件的操作也都是存入內存緩沖區buffer(內存速度快於硬盤,如果寫入文件的數據都從內存刷到硬盤,內存與硬盤的速度延遲會被無限放大,效率變低,所以要刷到硬盤的數據我們統一往內存的一小塊空間即buffer中放,一段時間後操作系統會將buffer中數據一次性刷到硬盤)
- flush即,強制將寫入的數據刷到硬盤
四、open函數詳解
1. open()語法
open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
open函數有很多的參數,常用的是file,mode和encoding
file文件位置,需要加引號
mode文件打開模式,見下面3
buffering的可取值有0,1,>1三個,0代表buffer關閉(只適用於二進制模式),1代表line buffer(只適用於文本模式),>1表示初始化的buffer大小;
encoding表示的是返回的數據采用何種編碼,一般采用utf8或者gbk;
errors的取值一般有strict,ignore,當取strict的時候,字符編碼出現問題的時候,會報錯,當取ignore的時候,編碼出現問題,程序會忽略而過,繼續執行下面的程序。
newline可以取的值有None, \n, \r, ”, ‘\r\n‘,用於區分換行符,但是這個參數只對文本模式有效;
closefd的取值,是與傳入的文件參數有關,默認情況下為True,傳入的file參數為文件的文件名,取值為False的時候,file只能是文件描述符,什麽是文件描述符,就是一個非負整數,在Unix內核的系統中,打開一個文件,便會返回一個文件描述符。
2. Python中file()與open()區別
兩者都能夠打開文件,對文件進行操作,也具有相似的用法和參數,但是,這兩種文件打開方式有本質的區別,file為文件類,用file()來打開文件,相當於這是在構造文件類,而用open()打開文件,是用python的內建函數來操作,建議使用open
五、上下文管理
#上下文管理with # read_f=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) # write_f=open(‘.a.txt.swp‘,‘w‘,encoding=‘utf-8‘) #上面兩句可以縮寫成下面一句 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as read_f, open(‘.a.txt.swp‘,‘w‘,encoding=‘utf-8‘) as write_f: for line in read_f: if ‘alex‘ in line: line=line.replace(‘alex‘,‘ALEXSB‘) write_f.write(line) os.remove(‘a.txt‘) os.rename(‘.a.txt.swp‘,‘a.txt‘)
Python(day5)文件操作