python 檔案操作,
file 對象使用 open 函數來建立,下面說一下對檔案的操作分三步:
1、開啟檔案擷取檔案的控制代碼,控制代碼就理解為這個檔案
2、通過檔案控制代碼操作檔案,讀取/寫入檔案內容
3、關閉檔案。
注意:
檔案開啟模式有3種:
1. w 寫入模式,不能讀取,只能寫入,若檔案不存在,則建立
2. r 讀模式,不能寫入,只能讀取,而且檔案必須存在;若不傳檔案開啟模式,則預設是 r 讀模式
3. a 追加模式,只能寫入,在檔案末尾新增內容
以w模式開啟檔案,寫入內容,如下:
fp = open('file.txt','w')fp.write('hhh') #若以w模式開啟存在的檔案,會清空以前的檔案內容,重新寫入hhh
以r模式開啟檔案,讀取檔案內容,如下:
fp = open('file.txt', 'r', encoding='utf-8') #windows 的預設字元集是gbk,需要設定為utf-8,encoding參數可以指定檔案的編碼print(fp.read()) #讀取檔案內容,返回結果類型是字串
以r模式開啟不存在的檔案,如下:
fp = open('a.txt', 'r') #若開啟的檔案不存在,則報錯:FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'print(fp.read())
以a模式開啟不存在的檔案,寫入內容,如下:
fp = open('a.txt', 'a') #寫入不存在的檔案名稱,a追加模式,若檔案不存在則建立fp.write('yiy') #在檔案末尾新增內容
以下是檔案常用的操作方法:
read()、readline()、readlines() 讀取檔案內容操作:
fp = open('file.txt', 'a+') #a+模式,指標在檔案最後的位置,需要將指標移動到初始檔案,才能讀取內容fp.seek(0) #多次讀取檔案內容時,一定要將遊標移動到初始位置,否則讀取內容為空白print(fp.read()) #讀取檔案內容,返回的是字串,指標移動到最後位置,大檔案時不要用,因為會把檔案內容都讀到記憶體中,記憶體不夠的話,會把記憶體撐爆
fp.seek(0) #將指標移動到初始位置
print(fp.readlines()) #讀取檔案內容,返回的是一個列表,元素是每行的資料,大檔案時不要用,因為會把檔案內容都讀到記憶體中,記憶體不夠的話,會把記憶體撐爆
fp.seek(0)
print(fp.readline()) #唯讀取檔案內容的一行內容,返回的是字串
大檔案時,讀取檔案高效的操作方法:
用上面的read()和readlines()方法操作檔案的話,會先把檔案所有內容讀到記憶體中,這樣的話,記憶體資料一多,非常卡,高效的操作,就是讀一行操作一行,讀過的內容就從記憶體中釋放了:
f = open('file.txt') for line in f: print(line)這樣的話,line就是每行檔案的內容,讀完一行的話,就會釋放一行的記憶體
write()、writelines() 寫入檔案內容操作:
fp = open('file.txt', 'a+')fp.write('2222'+'\n') #寫檔案時,只能寫入字串fp.writelines(['123\n', '456\n', '789']) #writelines可以將列表寫入檔案fp.seek(0)print(fp.readlines()) #執行結果:['2222\n', '123\n', '456\n', '789']
flush()重新整理檔案內容緩衝,如下:
import timefp = open('file.txt', 'w') #以w模式開啟檔案fp.write('歡樂頌') #寫入檔案內容fp.flush() #重新整理檔案內部緩衝,直接把內部緩衝區的資料立刻寫入檔案, 而不是被動的等待輸出緩衝區寫入time.sleep(30) #sleep時間是30sfp.close() #關閉檔案
tell()查看遊標的位置:
fp = open('file.txt', 'r+')print(fp.read()) #讀取檔案內容,執行結果:abcdefgprint(fp.tell()) #查看遊標所在位置,遊標在最後一位fp.seek(0) #將遊標移動到初始位置print(fp.tell()) #將遊標移動到初始位置後,查看遊標所在位置fp.seek(2) #將遊標移動到第2位print(fp.tell()) #將遊標移動到初始位置後,查看遊標所在位置,遊標在第二位fp.seek(0, 2) #將遊標移動到最末尾print(fp.tell()) #將遊標移動到初始位置後,查看遊標所在位置,遊標在最末尾
truncate(size)截取指定長度的內容:
fp = open('file.txt', 'r+') #file.txt檔案內容為abcdefgprint(fp.tell())#fp.truncate() #若沒有指定size,則清空檔案內容fp.truncate(3) #傳入size,表示從0開始截斷3位字元,其餘的清除fp.seek(0)print(fp.read()) #執行結果為:abc
with用法,開啟檔案後,可以不手動關閉,檔案不進行操作時,自動關閉,如下:
#with用法 open(檔案名稱) as 別名,預設開啟檔案是 r模式with open('file.txt') as fp: print(fp.read())
使用with開啟多個檔案,寫法如下:
with open('file.txt') as fp, open('a.txt') as fw: for line in fp: print(line) print(fw.readlines())
修改檔案的話,有兩種方式,一種是把檔案的全部內容都讀到記憶體中,然後把原有的檔案內容清空,重新寫新的內容;第二種是把修改後的檔案內容寫到一個新的檔案中:
第一種:
fp = open('file.txt', 'a+')fp.seek(0)res = fp.read() #返回結果類型是字串,指標在最後面fp.seek(0) #將指標移動到初始位置fp.truncate() #清空檔案內容new_res = res.replace('a', 'hello') #將a字串替換為hello,替換後為新的字串內容fp.write(new_res) #將替換後的內容寫入檔案
第二種:
import osfp = open('file.txt', 'a+')fp.seek(0)fw = open('a.txt', 'w') #開啟第二個檔案,專門寫入替換後的檔案內容for line in fp: #直接迴圈檔案對象,迴圈的是檔案每一行的內容 new_res = line.replace('hello', '666') #將hello替換為666,替換後為新的字串內容 fw.write(new_res) #將修改後的內容寫入第二個檔案fp.close() #關閉檔案,關閉後不能再進行讀寫操作fw.close()os.remove('file.txt') #刪除替換以前的檔案os.replace('a.txt', 'file.txt') #將新檔案名稱替換為已刪除的檔案名稱
import oswith open('file.txt') as fp, open('a.txt', 'w') as fw: for line in fp: new_res = line.replace('666', 'hello') fw.write(new_res)os.remove('file.txt')os.replace('a.txt', 'file.txt')
下表列出了 file 對象常用的函數:
序號 |
方法及描述 |
1 |
file.close() 關閉檔案。關閉後檔案不能再進行讀寫操作。 |
2 |
file.flush() 重新整理檔案內部緩衝,直接把內部緩衝區的資料立刻寫入檔案, 而不是被動的等待輸出緩衝區寫入。 |
3 |
file.fileno() 返回一個整型的檔案描述符(file descriptor FD 整型), 可以用在如os模組的read方法等一些底層操作上。 |
4 |
file.isatty() 如果檔案串連到一個終端裝置返回 True,否則返回 False。 |
5 |
file.next() 返迴文件下一行。 |
6 |
file.read([size]) 從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。 |
7 |
file.readline([size]) 讀取整行,包括 "\n" 字元。 |
8 |
file.readlines([sizehint]) 讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint位元組的行, 實際讀取值可能比sizhint較大, 因為需要填充緩衝區。 |
9 |
file.seek(offset[, whence]) 設定檔案當前位置 |
10 |
file.tell() 返迴文件當前位置。 |
11 |
file.truncate([size]) 截取檔案,截取的位元組通過size指定,預設為當前檔案位置。 |
12 |
file.write(str) 將字串寫入檔案,沒有傳回值。 |
13 |
file.writelines(sequence) 向檔案寫入一個序列字串列表,如果需要換行則要自己加入每行的分行符號。 |