文章目錄
一、open() 方法
open() 方法用於打開一個文件,並返回文件對象,在對文件進行處理過程都需要使用到這個函數。
如果該文件無法被打開,會拋出 OSError。
open() 函數常用形式是接收兩個參數:文件名(file)和模式(mode)。
完整的語法格式為:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數說明:
1、file: 必需,文件路徑(相對或者絕對路徑)。
例如:
采用相對路徑“f = open("…/test.txt",mode=‘w’)”打開上級文件夾的“test.txt”文件。
采用絕對路徑“f = open(“d:/test.txt”,mode=‘w’)”打開D盤根文件夾的“test.txt”文件。
2、mode: 可選,文件打開模式。
默認值為‘rt’,表示只讀文本模式。
3、buffering: 可選,設置緩沖。
缺省或設置為-1時,默認是8192個字節,8192/1024 = 8k。
設置為 0 時,表示不使用緩沖區,直接讀寫,僅在二進制模式下有效。
設置為 1 時,表示在文本模式下使用行緩沖區方式。
設置為 大於1 時,表示緩沖區的設置大小。
4、encoding: 一般使用utf8。
5、errors: 報錯級別。
6、newline: 區分換行符。
7、closefd: 傳入的file參數類型。
8、opener: 設置自定義開啟器,開啟器的返回值必須是一個打開的文件描述符。
二、mode 參數
x 寫模式,新建一個文件,如果該文件已存在則會報錯。
U 通用換行模式(Python 3 不支持)。
三、file 對象
file 對象使用 open 函數來創建,下表列出了 file 對象常用函數:
四、文件打開與關閉
f = open(…)是由操作系統打開文件。
如果打開的是文本文件,會涉及到字符編碼問題。
如果沒有為open指定編碼,那么打操作系統會用自己的默認編碼去打開文件。
在windows下是gbk,在linux下是utf-8。
默認打開模式為 r ,文件不存在則報錯,文件存在則文件內指針直接跳到文件開頭。
f=open('a.txt','r',encoding='utf-8')
下面一個代碼會將文件的內容由硬盤全部讀入內存,賦值給res。
res=f.read()
最后要向操作系統發起關閉文件的請求,回收系統資源。
f.close()
例如:
with open('test.txt', mode='rt', encoding='utf-8') as f:
for line in f:
print(line,end='')
可用with同時打開多個文件,用逗號分隔開即可
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data = read_f.read()
write_f.write(data)
五、注冊及認證用例
例如,實現用戶注冊及認證功能:
# 1.注冊模塊
name = input('請輸入您的注冊名: ').strip()
pwd = input('請輸入您的密碼: ').strip()
with open('database.txt', mode='a', encoding='utf-8') as f:
info = '%s:%s\n' % (name, pwd)
f.write(info)
# 2.登錄模塊
inp_name = input('請輸入您的賬號: ').strip()
inp_pwd = input('請輸入您的密碼: ').strip()
with open(r'database.txt', mode='r', encoding='utf-8') as f:
for line in f:
# 把用戶輸入的名字與密碼與讀出內容做比對
u, p = line.strip('\n').split(':')
if inp_name == u and inp_pwd == p:
print('恭喜您登錄成功!')
break
else:
print('您輸入的賬號名或者密碼錯誤!')
六、w 模式的使用
w是只寫模式:在文件不存在時創建空文檔;文件存在時清空文件,文件指針跑到文件開頭。
with open('b.txt',mode='w',encoding='utf-8') as f:
f.write('123\n')
f.write('1234\n')
f.write('12345\n')
在文件不關閉的情況下,連續的寫入,后寫的內容一定跟在前寫內容的后面。
如果重新以w模式打開文件,則會清空文件內容。
七、控制文件讀寫的模式
前提: t、b模式均不能單獨使用,必須與r/w/a之一結合使用
t(默認):文本模式
1、讀寫文件都以字符串為單位。
2、 只能針對文本文件。
3、必須指定encoding參數。
4、如果我們指定的文件打開模式為r/w/a,其實默認就是rt/wt/at。
b:二進制模式
1、讀寫文件都以二進制為單位。
2、可以針對所有文件。
3、一定不能指定encoding參數。
b模式對比t模式:
1、在操作純文本文件方面 t 模式幫我們省去了編碼與解碼的環節,b模式則需要手動編碼與解碼,所以此時t模式更為方便。
2、針對非文本文件(如圖片、視頻、音頻等)只能使用b模式。
八、讀操作
f.read() # 讀取所有內容,執行完該操作后,文件指針會移動到文件末尾
f.readline() # 讀取一行內容,光標移動到第二行首部
f.readlines() # 讀取每一行內容,存放於列表中
f.read()與f.readlines()都是將內容一次性讀入內容,如果內容過大會導致內存溢出。
若還想將內容全讀入內存,則必須分多次讀入,有兩種實現方式:
方式一
with open('a.txt',mode='rt',encoding='utf-8') as f:
for line in f:
print(line) # 同一時刻只讀入一行內容到內存中
方式二
with open('1.mp4',mode='rb') as f:
while True:
data=f.read(1024) # 同一時刻只讀入1024個Bytes到內存中
if len(data) == 0:
break
print(data)
九、控制文件內指針移動
文件內指針的移動都是Bytes為單位的,唯一例外的是 t 模式下的read(n),以n個字符為單位。
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read(3) # 讀取3個字符
with open('a.txt',mode='rb') as f:
data=f.read(3) # 讀取3個Bytes
若想讀取文件某一特定位置的數據,則需要用 f.seek 方法控制文件內指針的移動。
詳細用法如下:
f.seek(指針移動的字節數,模式控制)
十、seek模式控制
0:默認,該模式代表指針移動的字節數是以文件開頭的位置為參照的。
1:該模式代表指針移動的字節數是以當前位置為參照的。
2:該模式代表指針移動的字節數是以文件末尾的位置為參照的。
注意:其中 0 模式可以在 t 或 b 模式使用,而 1 跟 2 模式只能在 b模式下用
十一、文件的修改
注意:
1、硬盤空間是無法修改的,硬盤中數據的更新都是用新內容覆蓋舊內容。
2、內存中的數據是可以修改的。
文件修改是將硬盤中文件的內容讀入內存,然后在內存中修改完畢后再覆蓋回硬盤。
具體的實現方式分為兩種:
方式一:
將文件內容一次性全部讀入內存,然后在內存中修改完畢后再覆蓋寫回原文件。
優點: 在文件修改過程中同一份數據只有一份
缺點: 會過多地占用內存
with open('db.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
with open('db.txt',mode='wt',encoding='utf-8') as f:
f.write(data.replace('123'))
方式二:
以讀的方式打開原文件,以寫的方式打開一個臨時文件,一行行讀取原文件內容,修改完后寫入臨時文件。刪掉原文件,將臨時文件重命名原文件名。
優點: 不會占用過多的內存
缺點: 在文件修改過程中同一份數據存了兩份
import os
with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('123'))
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
結語
以上就是Python文件處理的基礎知識,希望對大家有所幫助。 如果大家有任何疑問請給我留言,我會盡快回復大家。在此也非常感謝大家對CSDN的支持!