Python文件模式及操作詳解


一、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的支持!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM