日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

with open新创建的文件在哪找_Python 简明教程——24,Python 文件读写

發布時間:2024/9/19 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 # True

5,with 語句原理

為什么open 函數能夠使用with 語句?

實際上open 函數能夠使用with 語句的原因取決于open 的返回值的類型。我們知道,open 的返回值的類型為_io.TextIOWrapper,而這個類中有兩個方法,__enter__ 方法和__exit__ 方法。

我們再來看下with 語句的格式:

with ... as ... : pass

with 關鍵字的后邊是一個表達式,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

可以看到執行步驟是這樣的:

  • 生成該類的對象,執行__init__ 方法
  • 進入with 語句塊,執行__enter__ 方法
  • 執行with 語句塊中的代碼
  • 退出with 語句塊,執行__exit__ 方法
  • 因為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 文件读写的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。