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 time fp = open(‘file.txt‘, ‘w‘) #以w模式打開文件 fp.write(‘歡樂頌‘) #寫入文件內容 fp.flush() #刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入 time.sleep(30) #sleep時間是30s fp.close() #關閉文件
tell()查看遊標的位置:
fp = open(‘file.txt‘, ‘r+‘) print(fp.read()) #讀取文件內容,執行結果:abcdefg print(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文件內容為abcdefg print(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 os fp = 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 os with 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) 向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。 |
python 文件操作