當前位置:首頁 » 編程語言 » python寫入文件with

python寫入文件with

發布時間: 2024-02-03 11:11:24

❶ 揭秘 python 中的 with 關鍵字

正文

你有沒有想過 with 語句是什麼以及我們為什麼使用它呢?請閱讀這篇文章!我們中的許多人在 Python 代碼中一遍又一遍地看到這個代碼片段: with open( 'Hi.text' , 'w' ) as f:
f.write( "Hello, there" )

但是,我們中的一些人不知道 with 有什麼用,以及為什麼我們需要在這里使用它。在此閱讀中,您將找到關於 with 可解決的幾乎所有問題。讓我們開始吧!


首先,讓我們考慮一下如果不使用 with 關鍵字我們需要做什麼。在這種情況下,我們需要先打開文件並 嘗試 執行 write 。不管成功與否,我們最好在 最後 關閉它,所以我們的代碼將如下所示:

f = open( 'Hi.text' , 'w' )
try :
f.write( 'Hello, there' )
finally :
f.close()

那麼, with 關鍵字有什麼用呢?它只是有助於將我們的 try..finally 代碼縮短為 with... 的單個語句!這就是 with 語句用法。


那麼,它到底是什麼?事實上, with 語句本身在 Python 中並沒有什麼特別之處,它只是 Python 中 上下文管理器 的一個特性。 上下文管理器 ,引用自 Python 官方文檔, 是一種讓您在需要時准確分配和釋放資源的方法 ,或者簡單來說: 當您在某些資源上做某事時縮短您的代碼片段 ,這意味著您可以自己定義 with 語句的用法!


我們如何做到這一點?嗯,很簡單,你只需要實現兩個 魔術函數 :一個叫做 __enter__ ,另一個叫做 __exit__ 。第一種方法是編寫一個實現這兩個函數的類,如下所示:

class My_file :
def __init__ (self, fname):
self.fname = fname
def __enter__ (self):
self.file = open(self.fname, 'w' )
return self.file
def __exit__ (self, exc_type, exc_val, exc_trace_back):
if self.file:
self.file.close()

在這里,我們創建了一個普通的 Python 類,實現了兩個魔術函數。注意這兩個函數的簽名: __enter__ 只接受 self ,而 __exit__ 將接受更多參數,示例中的這三個是標准形式。這樣,我們就可以直接使用:

with My_file( 'hello.txt' ) as f:
f.write( 'hello, world!' )

這里的 with 語句會先調用 __init__ 構造一個新對象,然後再調用 __enter__ 方法;最後,它會在代碼塊完成之前觸發 __exit__ 方法。所以,上面代碼的大致等價如下:

myfile = My_file( 'hello.txt' )
f = myfile.__enter__()
f.write( 'hello, world!' )
myfile.__exit(...)

實現 上下文管理器 的第二種方法是通過 裝飾器 ,如下:

1.你 import contextmanager from contextlib

2.你寫一個函數來實現你想要的 with 語句。

3.在函數上方添加一個裝飾器 @contextmanager 。

4.使用你的 with your_function !


根據上面的介紹,讓我們寫一個 裝飾器上下文管理器

from contextlib import contextmanager
@contextmanager
def my_file_open (fname):
try :
f = open(fname, 'w' )
yield f
finally :
print( 'Closing file' )
f.close()

with file_open( 'hi.txt' ) as f:
f.write( 'hello world' )

@contextmanager
def closing (f):
try :
f.write( "Finish writing" )
finally :
f.close()

with closing(open( "hi.text" )):
f.write( "hello world" )

例如,在上面的代碼中,我們可以直接調用 with close(your_way_of_getting_resource) ,在你下面寫的代碼塊即將完成之前( f.write("hello world") ),它會執行 try..finally 我們在上面定義的塊。另一個是使用 suppress 工具。我們知道,在很多情況下,如果我們嘗試獲取一些資源,很可能在打開文件時會出現 FileNotFoundException 等錯誤。在某些情況下,我們希望捕獲錯誤或抑制錯誤,以便程序繼續正常運行。 suppress 是我們可以抑制警告的一種方式。你需要做的就是弄清楚你想要抑制哪個異常,並編寫 with suppress(your_choice_of_exception) ,Python 將從這里開始處理它。在其他情況下,您可能只想在輸入 with 代碼塊時執行某些操作。在這種情況下, nullcontext 對你來說會很方便。 nullcontext 只會返回你在 __enter__ 函數中定義的東西,而不會做任何其他事情。如果您在 Python 中處理 async 操作以訪問資源,則 aclosure 是處理這種情況的實用工具。


總結


本文介紹了 with 語句的一些基本概念和用法及其底層工作原理。還有很多有趣的東西,請查看 Python 的 contextlib 文檔。最後,祝您能像往常一樣快樂學習和快樂編碼!

鏈接:https://python.plainenglish.io/demystifying-the-with-keyword-in-python-53be94e8b31a

你還有什麼想要補充的嗎?

❷ python中with語句的作用

with語句相當於你定義一個類的時候定義了__enter__()和__exit__()這個兩個方法。
在我們進行文件操作的的時候會用到open方法,後面有了with open以後就不再只使用open方法了,為什麼?因為with open方法簡單,我們不用再去管關閉文件了,即使中間發生異常,with open也會幫我們把文件關閉掉,以下示例演示下with open方法;
class File(object):
"""文件操作類"""
def __init__(self, filepath, mode):
self.filepath = filepath
self.mode = mode

def __enter__(self):
"""打開文件"""
self.file = open(self.filepath, self.mode)
print("打開文件")
return self.file

def __exit__(self, exc_type, exc_val, exc_tb):
"""關閉文件"""
print("關閉文件")
self.file.close()

if __name__ == '__main__':
with File('log.log', 'r') as file:
file.write("家啊")

可以看出來有了__enter__()和__exit__(),我們自定義的類也可以使用with了

❸ python with open 頻繁寫入文件導致coach無法釋放

程序執行速度太快,以至於讀到內容還沒有完全寫入文件,文件就已經關閉了。
使用open()方法一定要保證關閉文件對象,即調用close()方法。當我們寫文件時,操作系統往往不會立刻把數據寫入磁碟,而是放到內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁碟同時釋放資源。忘記調用close()的後果是數據可能只寫了一部分到磁碟,剩下的丟失了。
將這些個文件路徑的list,分成若干個,至於分成多少,要看自己cpu核心有多少,比如你的cpu有32核的,理論上就可以加速32倍。

熱點內容
內存大小的存儲 發布:2025-01-22 18:58:17 瀏覽:392
tampermonkey腳本 發布:2025-01-22 18:53:17 瀏覽:117
windows7共享文件夾 發布:2025-01-22 18:53:17 瀏覽:478
如何調節安卓手機的內存 發布:2025-01-22 18:49:30 瀏覽:638
佳能相機存儲卡怎麼取消 發布:2025-01-22 18:40:59 瀏覽:568
天貓寶貝上傳 發布:2025-01-22 18:35:09 瀏覽:544
ipad如何登錄金鏟鏟安卓賬號 發布:2025-01-22 18:32:09 瀏覽:319
加密溝通 發布:2025-01-22 18:31:22 瀏覽:555
win7ftp用戶名和密碼設置 發布:2025-01-22 17:46:48 瀏覽:221
三表聯查的sql語句 發布:2025-01-22 17:27:13 瀏覽:418