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