open方法
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None,
closefd=True, opener=None)
打開一個文件,返回一個文件對象(流對象)和文件描述符。打開文件失敗,則返回異常
基本使用:創建一個文件test,然后打開它,用完
關閉
f = open("test") # file對象 # windows <_io.TextIOWrapper name='test' mode='r' encoding='cp936'> # linux <_io.TextIOWrapper name='test' mode='r' encoding='UTF-8'> print(f.read()) # 讀取文件 f.close() # 關閉文件
文件操作中,最常用的操作就是讀和寫。
文件訪問的模式有兩種:文本模式和二進制模式。不同模式下,操作函數不盡相同,表現的結果也不一
樣。
注:
windows中使用codepage代碼頁,可以認為每一個代碼頁就是一張編碼表。cp936等同於GBK。
模式對於IO操作來說,其實只有讀和寫兩種:
只讀 r
只寫 w、x、a
增加缺失能力 +
r 模式
只讀打開文件,如果使用write方法,會拋異常
如果文件不存在,拋出FileNotFoundError異常
w 模式
表示只寫方式打開,如果讀取則拋出異常
如果文件不存在,則直接創建文件
如果文件存在,則清空文件內容
x 模式
文件不存在,創建文件,並只寫方式打開
文件存在,拋出FileExistsError異常
a 模式
文件存在,只寫打開,追加內容
文件不存在,則創建后,只寫打開,追加內容
wxa模式都可以產生新文件
w不管文件存在與否,都會生成全新內容的文件
a不管文件是否存在,都能在打開的文件尾部追加
x必須要求文件事先不存在,自己要造一個新文件
文本模式t
字符流,將文件的字節按照某種字符編碼理解,按照字符操作。open的默認mode就是rt。
二進制模式b
字節流,將文件就按照字節理解,與字符編碼無關。二進制模式操作時,字節操作使用bytes類型
+ 模式
為r、w、a、x提供缺失的讀或寫功能,但是,獲取文件對象依舊按照r、w、a、x自己的特征。+模式不能單獨使用,可以認為它是為前面的模式字符做增強功能的。
encoding:編碼,僅文本模式使用
None 表示使用缺省編碼,依賴操作系統。windows、linux下測試如下代碼
f = open('test1','w') f.write('啊') f.close()
windows下缺省GBK(0xB0A1),Linux下缺省UTF-8(0xE5 95 8A)
文件指針
mode=r,指針起始在0
mode=a,指針起始在EOF
f = open('o:/test.txt', 'wb+') print(f) f.write(b'abc') print(f.tell()) f.close() f = open('o:/test.txt', 'rt+') # windows下打開 f.write('啊') # 從什么地方開始寫幾個字節? print(hex(ord('啊')), '啊'.encode(), '啊'.encode('gbk')) print(f.tell()) f.close()
read
read(size=-1)
size表示讀取的多少個字符或字節;負數或者None表示讀取到EOF
filename = 'o:/test.txt' f = open(filename, 'w+') f.write('馬哥教育') f.close() f = open(filename) print(1, f.read(1)) # 按字符 print(2, f.read(2)) print(3, f.read()) f.close() f = open(filename, 'rb') print(4, f.read(1)) # 按字節 print(5, f.read(2)) print(6, '馬哥教育'.encode('gbk')) print(7, f.read()) f.close()
建議,使用文件對象時,一定要指定編碼,而不是使用默認編碼
write
write(s),文本模式時,從當前指針處把字符串s寫入到文件中並返回寫入字符的個數;二進制時將
bytes寫入文件並返回寫入字節數
writelines(lines),將字符串列表寫入文件
filename = 'o:/test.txt' f = open(filename, 'w+') lines = ['abc', '123\n', 'magedu'] # 需提供換行符 # for line in lines: # f.write(line) f.writelines(lines) f.seek(0) # 回到開始 print(f.read()) f.close()
close
flush並關閉文件對象。文件已經關閉,再次關閉沒有任何效果。可以查看文件對象的closed屬性(f.closed),判斷
是否關閉
上下文管理
文件對象這種打開資源並一定要關閉的對象,為了保證其打開后一定關閉,為其提供了上下文支持。
filename = 'o:/test.txt' with open(filename) as f: print(1, f.closed) print(f.write('abcd')) # r模式寫入失敗,拋異常 print(2, f.closed) # with中不管是否拋異常,with結束時都會保證關閉文件對象
with 文件對象 as 標識符: # 等同於 標識符 = 文件對象 pass # 標識符可以在內部使用
上下文管理
1. 使用with關鍵字,上下文管理針對的是with后的對象
2. 使用with ... as 關鍵字
3. 上下文管理的語句塊並不會開啟新的作用域
文件對象上下文管理1. 進入with時,with后的文件對象是被管理對象
2. as子句后的標識符,指向with后的文件對象
3. with語句塊執行完的時候,會自動關閉文件對象
filename = 'o:/test.txt' f = open(filename) with f: print(1, f.closed) print(f.write('abcd')) # r模式寫入失敗 print(2, f.closed) # with中不管是否拋異常,with結束時都會關閉文件對象
filename = 'o:/test.txt' f = open(filename) with f as f2: print(f is f2) # True
文件的遍歷
類似於日志文件,文件需要遍歷,最常用的方式就是逐行遍歷。
filename = 'o:/test.txt' with open(filename, 'w') as f: f.write('\n'.join(map(str, range(101, 120)))) with open(filename) as f: for line in f: # 文件對象時可迭代對象,逐行遍歷 print(line.encode()) # 帶換行符