9、文件操作
阿新 • • 發佈:2017-05-20
gbk seek 編碼 trunc int 必須 時也 tell 二進制
一.文件處理流程
- 打開文件,得到文件句柄並賦值給一個變量
- 通過句柄對文件進行操作
- 關閉文件
f=open(‘a.txt‘,‘w‘) f.write(‘111111\n‘) f.close()
二.基本操作
2.1 文件編碼
#不指定打開編碼,默認使用操作系統的編碼,windows為gbk,linux為utf-8,與解釋器編碼無關 f=open(‘chenli.txt‘,encoding=‘gbk‘) #在windows中默認使用的也是gbk編碼,此時不指定編碼也行 f.read()
2.2 文件打開模式
f=open(‘文件名‘,‘模式‘) f=open(‘a.txt‘,‘r+‘) #讀寫 f=open(‘a.txt‘,‘w+‘) #寫讀 f=open(‘a.txt‘,‘a+‘) #追加並且讀 。 。 。 。 。 。
打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此文件句柄對該文件操作。
打開文件的模式有:
- r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
- w,只寫模式【不可讀;不存在則創建;存在則清空內容】
- x, 只寫模式【不可讀;不存在則創建,存在則報錯】
- a, 追加模式【可讀; 不存在則創建;存在則只追加內容】
"+" 表示可以同時讀寫某個文件
- r+, 讀寫【可讀,可寫】
- w+,寫讀【可讀,可寫】
- x+ ,寫讀【可讀,可寫】
- a+, 寫讀【可讀,可寫】
"b"表示以字節的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
註:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼
常見的mode取值組合
r或rt 默認模式,文本模式讀 rb 二進制文件 w或wt 文本模式寫,打開前文件存儲被清空 wb 二進制寫,文件存儲同樣被清空 a 追加模式,只能寫在文件末尾 a+ 可讀寫模式,寫只能寫在文件末尾 w+ 可讀寫,與a+的區別是要清空文件內容 r+ 可讀寫,與a+的區別是可以寫到文件任何位置
2.3 上下文管理
1 #上下文管理 2 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f,open(‘b.txt‘) as b_f:3 # print(f.read()) 4 print(‘====>‘)
補充
1 for i in range(3): 2 print(i) 3 # continue 4 if i == 1: 5 break 6 else: 7 print(‘=============>‘) #當for循環不被break打斷,就會執行else的代碼 8 9 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as read_f,10 open(‘aa.txt‘,‘w‘,encoding=‘utf-8‘) as write_f: 11 12 for line in read_f: 13 write_f.write(line) 14 else: 15 print(‘write successfull‘)
2.4 文件的操作方法
f.read 讀取文件所有內容
f.read 讀取文件所有內容
f.readline 讀取一行內容
f.readlines 讀取每行內容,返回一個列表
f.close() 關閉文件
f.seek() 移動指針到指定位置
f.tell() 獲取當前指針位置
f.flush() 把緩存寫入到硬盤
f.mode() 顯示文件打開格式
f.truncate() f.truncate(10)截取文件0-10字符,超出部分刪除
f.writelines() 傳入一個列表,並將列表每個元素寫入到文件
f.xreadlines() 已叠代方式循環文件,每循環一次,只讀一行。處理大文件效率高
1 #不常用的,了解 2 3 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f: 4 print(f.read(4)) #數字指的是讀的是字符 5 6 with open(‘a.txt‘,‘rb‘) as f: 7 print(f.read(1)) #數字指的是讀的是字符 8 9 10 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f: 11 f.seek(3) #seek內指定的數字代表字節 12 print(f.tell()) #當前光標所在的位置 13 print(f.read()) 14 15 with open(‘aa.txt‘,‘r+‘,encoding=‘utf-8‘) as f: 16 # f.seek(3) #seek內指定的數字代表字節 17 # print(f.read()) 18 19 f.truncate(1) 20 21 22 with open(‘b.txt‘,‘rb‘) as f: 23 f.read() 24 f.seek(3) #默認情況,是以文件起始位置作為開始,往後移動3個bytes 25 f.read(1) 26 print(f.tell()) 27 f.seek(2,1) #1 代表以當前光標所在的位置為開始,往後移動2個 bytes 28 print(f.tell()) 29 30 f.seek(-1,2) #2表以當前光標所在的位置為開始,往後移動2個 bytes 31 print(f.tell()) 32 33 f.seek(0,2) 34 35 with open(‘c.txt‘,‘r‘,encoding=‘utf-8‘) as f: 36 f.seek(0,2) 37 print(‘====>‘,f.read())
2.5 文件的修改
1 import os 2 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as read_f, 3 open(‘.a.txt.swap‘,‘w‘,encoding=‘utf-8‘) as write_f: 4 for line in read_f: 5 if line.startswith(‘hello‘): 6 line=‘哈哈哈\n‘ 7 write_f.write(line) 8 9 os.remove(‘a.txt‘) 10 os.rename(‘.a.txt.swap‘,‘a.txt‘)
9、文件操作