with open新创建的文件在哪找_Python 简明教程——24,Python 文件读写
目錄
無論是哪種編程語言,IO 操作都是非常重要的部分。I 即Input(輸入),O 即Output(輸出)。
IO 操作一般分為以下兩種:
- 磁盤IO: 即在磁盤上讀寫文件。讀文件是指將文件內(nèi)容從磁盤讀入內(nèi)存,寫文件是指將內(nèi)存中的內(nèi)容寫到磁盤。
- 網(wǎng)絡(luò)IO: 即文件在網(wǎng)絡(luò)上傳輸。網(wǎng)絡(luò)傳輸一般會有兩種角色,分別是服務(wù)端(如HTTP Server)和客戶端(如瀏覽器)。
本節(jié)我們主要介紹磁盤IO,即文件讀寫。
1,open 函數(shù)介紹
要想讀寫文件,首先要打開一個文件。
Python 中的內(nèi)建函數(shù)open 用來打開一個文件,我們可以使用help(open),來查看open 函數(shù)的原型,如下:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)該函數(shù)成功調(diào)用時會返回一個流stream,用于讀寫文件等操作;發(fā)生錯誤時會拋出IOError 異常。
被打開的文件占用了系統(tǒng)資源,使用完后要記得close,否則會浪費系統(tǒng)資源。
不管以讀模式打開文件,還是以寫模式打開文件,成功打開一個文件后,這個可操作文件的流的內(nèi)部都有一個隱含的指針,一般這個指針會指向文件開頭或者文件末尾的位置,表示從文件的哪個位置讀寫文件。
可以看到,該函數(shù)支持8 個參數(shù),但最重要的是前兩個參數(shù):
- file:是指要打開的文件的路徑
- mode:是指以什么模式打開文件,要用引號引住
mode 參數(shù)支持的模式(默認為讀文本模式,即rt)如下:
- r:以讀模式打開文件(默認方式),指針在文件開頭
- w:以寫模式打開文件,如果件已存在,則內(nèi)容會被清空(指針在文件開頭);如果文件不存在,則會創(chuàng)建新文件
- x:創(chuàng)建一個新文件,并以寫模式打開,指針在文件開頭,如果文件已存在,則拋出FileExistsError異常
- a:以寫模式打開文件,如果文件已有內(nèi)容,在寫入內(nèi)容時,會追加到文件末尾(指針在文件末尾)
- b:以二進制模式打開文件,一般用于讀寫二進制文件,如圖片,視頻等
- t:以文本模式打開文件(默認方式),一般用于讀寫文本文件
- +:以讀寫模式打開文件,指針在文件開頭
這些模式還可以組合使用,常見的組合如下:
- rb:以二進制模式打開一個文件,用于只讀
- r+:打開一個文件,用于讀寫
- rb+:以二進制模式打開一個文件,用于讀寫
- wb:以二進制模式打開一個文件,用于寫
- w+:打開一個文件,用于讀寫
- wb+: 以二進制模式打開一個文件,用于讀寫
- ab: 以二進制模式打開一個文件,用于追加
- a+:打開一個文件用于讀寫,指針在文件末尾
- ab+:以二進制模式打開一個文件,用于讀寫,指針在文件末尾
2,open 函數(shù)示例
如下代碼,成功打開文件./1.txt:
f = open('./1.txt')通過type(f)查看open 函數(shù)的返回值的類型:
>>> type(file)可看到,其返回值類型為_io.TextIOWrapper。
我們用dir(f) 來查看對象 f 支持的屬性和方法:
>>> dir(file)['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']可以通過help(f.方法名) 來查看每個方法的幫助手冊,也可以使用help(f) 來查看該對象的所有屬性和方法,及其簡介。
我們來看一下常用方法的作用:
- mode:打開文件時的模式
- name:被打開的文件名
- close:關(guān)閉文件流,并刷新緩沖區(qū)中的內(nèi)容,之后不能再操作文件
- closed:文件流是否已關(guān)閉
- flush:刷新寫緩沖區(qū),只寫流與非阻塞流不適用
- read:讀入文件內(nèi)容
- readable:是否可讀
- readline:讀入一行內(nèi)容
- readlines:讀入文件所有的行,直至文件末尾
- seek:移動文件指針的位置
- seekable:文件指針是否可被移動
- tell:返回文件指針當前位置
- truncate:截斷文件內(nèi)容
- writable:是否可寫
- write:向文件中寫入內(nèi)容
- writelines:向文件中寫入多行
3,關(guān)閉系統(tǒng)資源
正確的調(diào)用close() 函數(shù)是關(guān)鍵的。
在成功打開一個文件后,對該文件進行操作(讀寫)時,有可能發(fā)生異常。
比如我們打開的文件只能用來寫,如果用來讀,則會發(fā)生異常:
>>> f = open('1.txt', 'w') # 用只讀模式打開文件>>> f.readable() # 查看文件是否可讀False # 返回 False,表示不可讀>>> f.read() # 讀文件,發(fā)生異常Traceback (most recent call last): File "", line 1, in io.UnsupportedOperation: not readable如果,我們將這段代碼寫在文件中:
#! /usr/bin/env python3f = open('1.txt', 'w')f.read()f.close()用python3 來執(zhí)行,結(jié)果如下:
$ python3 Test.py Traceback (most recent call last): File "Test.py", line 4, in f.read()io.UnsupportedOperation: not readable可以看到,在執(zhí)行到f.read() 這句代碼的時候,程序異常退出,那么后邊的f.close() 就沒有執(zhí)行到,這就導(dǎo)致程序執(zhí)行不夠完整,系統(tǒng)資源沒有關(guān)閉。
這時,我們可以用try...finally來處理,如下:
#! /usr/bin/env python3f = open('1.txt', 'w')try: f.read()except Exception as e: print('read file err:%s' % e)finally: f.close() print('file closed')上面代碼的執(zhí)行結(jié)果如下:
$ python3 Test.py read file err:not readablefile closed我們將f.close() 這句代碼放在了finally 代碼塊中,這樣,不管遇到什么情況,f.close() 這句話總會被執(zhí)行,就不會導(dǎo)致系統(tǒng)資源泄漏的問題。
4,with 語句使用
為了確保系統(tǒng)資源能夠關(guān)閉,Python 中提供了with 語句,能夠讓我們更加安全方面的使用open 函數(shù),而不用關(guān)心資源關(guān)閉的問題。
with 語句也叫上下文管理器,有了with 語句,我們可以這樣使用open 函數(shù):
with open('./1.txt') as f: print(f.read())這樣的代碼,不管在with 語句塊內(nèi)出現(xiàn)怎樣的異常,close 函數(shù)都會被調(diào)用,而我們也不需要自己調(diào)用。
使用with 語句,就不再需要使用try...finally 語句,也使得代碼更加簡潔。
需要特別注意的是,這里的f只能在with 語句塊中使用,一旦離開with 語句塊,f 就被關(guān)閉了。如果在with 語句塊之外使用f 進行讀寫等操作,將出現(xiàn)異常。
如下代碼中,f.closed 將返回True:
with open('./1.txt') as f: passf.closed # True5,with 語句原理
為什么open 函數(shù)能夠使用with 語句?
實際上open 函數(shù)能夠使用with 語句的原因取決于open 的返回值的類型。我們知道,open 的返回值的類型為_io.TextIOWrapper,而這個類中有兩個方法,__enter__ 方法和__exit__ 方法。
我們再來看下with 語句的格式:
with ... as ... : passwith 關(guān)鍵字的后邊是一個表達式,as 后邊是一個變量名,表達式的計算結(jié)果會賦值給as 后邊的變量。
Python 規(guī)定,只要一個類中有__enter__和__exit__ 方法,就可以使用with 語句。with 語句后邊的表達式執(zhí)行完畢后,就會執(zhí)行__enter__ 方法,在退出with 語句塊時,會執(zhí)行__exit__ 方法。
我們自己編寫一個測試類,使其能夠使用with 語句:
#! /usr/bin/env python3class TestWith: def __init__(self): print('執(zhí)行__init__') def __enter__(self): print('執(zhí)行__enter__') def __exit__(self, exc_type, exc_val, exc_tb): print('執(zhí)行__exit__') print('exc_type is %s' % exc_type) print('exc_val is %s' % exc_val) print('exc_tb is %s' % exc_tb)在該類中有三個函數(shù):
- __init__:構(gòu)造函數(shù),創(chuàng)建類的對象時調(diào)用
- __enter__:進入with 語句塊時會調(diào)用
- __exit__:離開with 語句塊時會調(diào)用
其中__exit__ 方法有三個參數(shù):
- exc_type:with 語句塊中的代碼發(fā)生異常時的異常類型
- exc_val:發(fā)生異常時的異常值
- exc_tb:發(fā)生異常時的traceback 類的對象
我們這樣使用這個類:
with TestWith() as t: print('test with')用python3 來執(zhí)行,結(jié)果如下:
$ python3 Test.py 執(zhí)行__init__執(zhí)行__enter__test with執(zhí)行__exit__exc_type is Noneexc_val is Noneexc_tb is None可以看到執(zhí)行步驟是這樣的:
因為with 語句塊中沒有發(fā)生異常,所以__exit__ 方法中的 exc_type,exc_val,exc_tb 三個參數(shù)均為None。
下面再示范一個with 語句塊中出現(xiàn)異常的代碼:
with TestWith() as t: print('test with1...') 1 / 0 # 除數(shù)為 0,拋出異常 print('test with2...')該代碼的執(zhí)行結(jié)果如下:
$ python3 Test.py 執(zhí)行__init__執(zhí)行__enter__test with1...執(zhí)行__exit__exc_type is exc_val is division by zeroexc_tb is Traceback (most recent call last): File "Test.py", line 27, in 1 / 0ZeroDivisionError: division by zero通過上面的執(zhí)行結(jié)果可以看到,在執(zhí)行1 / 0 之前,我們不用多說。在執(zhí)行到1 / 0 時,出現(xiàn)異常,然后會執(zhí)行__exit__ 方法。
在執(zhí)行結(jié)果中,我們能看到 exc_type,exc_val,exc_tb 三個參數(shù)的值,最后拋出Traceback 異常。
with 語句中,拋出異常的語句1 / 0 之后的代碼不會再執(zhí)行。
(完。)
總結(jié)
以上是生活随笔為你收集整理的with open新创建的文件在哪找_Python 简明教程——24,Python 文件读写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wifi共享大师电脑版_手机也能给电脑上
- 下一篇: numpy 矩阵乘法_一起学习Pytho