with open用法


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()) # 帶換行符

 


免責聲明!

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



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