示例
# 使用 with 語句打開文件并讀取內容
with open('pi.txt', 'r') as file_object:contents = file_object.read()print(contents)
# 文件在代碼塊結束后自動關閉
with 解析
with 是 Python 中的上下文管理器語法,用于確保某個操作完成后自動執行清理操作。它常用于文件操作、鎖操作等場景。
with 的基本語法:
with <context_manager> as <variable>:# 在這個代碼塊中,可以使用 <variable># 當代碼塊執行完畢時,會自動執行清理操作
<context_manager>:
上下文管理器對象,它必須實現了上下文管理協議(即 enter() 和 exit() 方法)。常與open函數結合使用內部為(file, mode)
with open(file, mode) as variable:# 在這個代碼塊中,可以對文件進行操作# 當代碼塊執行完畢時,文件會自動關閉
<variable>:
上下文管理器的 enter() 方法返回的對象,通常是一個資源(如文件對象、鎖對象等)。
代碼塊:
在代碼塊中可以對 進行操作。
自動清理:
當代碼塊執行完畢時,會自動調用上下文管理器的 exit() 方法,執行清理操作。
with 的工作原理
with 語句的核心在于上下文管理器協議,它包含兩個方法:
__enter__():
在代碼塊執行之前調用。
返回一個資源對象(如文件對象),這個對象會被賦值給 as 后面的變量。
__exit__():
在代碼塊執行完畢時調用。
用于執行清理操作,例如關閉文件、釋放鎖等。
如果代碼塊中發生異常,exit() 方法會捕獲異常并可以選擇處理它。
文件操作
文件對象是一個典型的上下文管理器,它實現了 enter() 和 exit() 方法。
enter():打開文件并返回文件對象。
exit():關閉文件。
with open('pi.txt', 'r') as file_object:contents = file_object.read()print(contents)
# 文件在代碼塊結束后自動關閉
逐行解析:
with open('pi.txt', 'r') as file_object::
open('pi.txt', 'r') 返回一個文件對象。
文件對象的 enter() 方法被調用,返回文件對象本身。
文件對象被賦值給變量 file_object。
contents = file_object.read():
使用 file_object 調用 read() 方法,讀取文件內容。
print(contents):
打印文件內容。
代碼塊結束后:
自動調用文件對象的 exit() 方法,關閉文件。
優點
with open(file, mode) as variable:# 在這個代碼塊中,可以對文件進行操作# 當代碼塊執行完畢時,文件會自動關閉
自動關閉文件
:使用 with 語句時,文件會在代碼塊執行完畢后自動關閉,即使在文件操作過程中發生異常,文件也會被正確關閉。
代碼更簡潔
:避免了手動調用 file.close(),使代碼更加簡潔易讀。
open 解析
open 是 Python 中用于打開文件的內置函數,它的語法如下:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
雖然 open 函數有很多參數,但在實際使用中,通常只需要關注前兩個參數:file 和 mode。
(1) file 參數
作用:指定要打開的文件路徑。
類型:字符串,可以是相對路徑或絕對路徑。
相對路徑:相對于當前工作目錄的路徑。例如:
open('pi.txt') # 當前工作目錄下的文件
open('data/pi.txt') # 當前工作目錄下的 data 文件夾中的文件
絕對路徑:從根目錄開始的完整路徑。例如:
open('/home/user/data/pi.txt') # Linux 系統中的絕對路徑
open('C:\\Users\\User\\data\\pi.txt') # Windows 系統中的絕對路徑
(2) mode 參數
作用:指定文件的打開模式,默認值為 ‘r’(只讀模式)。
常見模式:
‘r’:只讀模式。如果文件不存在,會拋出 FileNotFoundError。
‘w’:寫入模式。如果文件不存在,會創建一個新文件;如果文件已存在,會清空文件內容。
‘x’:獨占寫入模式。如果文件不存在,會創建一個新文件;如果文件已存在,會拋出 FileExistsError。
‘a’:追加模式。如果文件不存在,會創建一個新文件;如果文件已存在,會在文件末尾追加內容。
‘t’:文本模式(默認)。以文本形式讀寫文件。
‘b’:二進制模式。以二進制形式讀寫文件,適用于讀取圖片、視頻等二進制文件。
‘+’:更新模式。用于同時讀寫文件。
用法示例
只讀模式
‘r’:只讀模式(默認模式)。如果文件不存在,會拋出 FileNotFoundError。
with open('pi.txt', 'r') as file_object:contents = file_object.read()print(contents)
寫入模式
‘w’:寫入模式。如果文件不存在,會創建一個新文件;如果文件已存在,會清空文件內容。
with open('pi.txt', 'w') as file_object:file_object.write("Hello, world!")
注意:使用 ‘w’ 模式時要小心,因為文件內容會被清空。
追加模式
‘a’:追加模式。如果文件不存在,會創建一個新文件;如果文件已存在,會在文件末尾追加內容。
with open('pi.txt', 'a') as file_object:file_object.write("\nThis is a new line.")
獨占寫入模式
‘x’:獨占寫入模式。如果文件不存在,會創建一個新文件;如果文件已存在,會拋出 FileExistsError。
with open('pi.txt', 'x') as file_object:file_object.write("Hello, world!")
用途:確保文件不會被覆蓋。
文本模式
‘t’:文本模式(默認模式)。以文本形式讀寫文件。
with open('pi.txt', 'r') as file_object:contents = file_object.read()print(contents)
二進制模式
‘b’:二進制模式。以二進制形式讀寫文件,適用于讀取圖片、視頻等二進制文件。
with open('image.png', 'rb') as file_object:contents = file_object.read()
更新模式
‘+’:更新模式。用于同時讀寫文件。
with open('pi.txt', 'r+') as file_object:contents = file_object.read()file_object.write("\nThis is a new line.")
組合模式
‘r+’:讀寫模式。文件必須存在,可以讀取和寫入。
with open('pi.txt', 'r+') as file_object:contents = file_object.read()file_object.write("\nThis is a new line.")
‘w+’:寫讀模式。如果文件不存在,會創建一個新文件;如果文件已存在,會清空文件內容,然后可以讀取和寫入。
with open('pi.txt', 'w+') as file_object:file_object.write("Hello, world!")file_object.seek(0) # 移動文件指針到文件開頭contents = file_object.read()print(contents)
‘a+’:追加讀寫模式。如果文件不存在,會創建一個新文件;如果文件已存在,會在文件末尾追加內容,同時可以讀取文件。
with open('pi.txt', 'a+') as file_object:file_object.write("\nThis is a new line.")file_object.seek(0) # 移動文件指針到文件開頭contents = file_object.read()print(contents)
二進制組合模式
‘rb+’:二進制讀寫模式。
‘wb+’:二進制寫讀模式。
‘ab+’:二進制追加讀寫模式。
選擇模式的建議
讀取文件:使用 ‘r’ 或 ‘rb’(二進制模式)。
寫入文件:使用 ‘w’ 或 ‘wb’(二進制模式)。
追加內容:使用 ‘a’ 或 ‘ab’(二進制模式)。
同時讀寫:使用 ‘r+’、‘w+’ 或 ‘a+’,并根據需要選擇二進制模式。
常見問題
文件不存在
如果文件不存在,open 函數會拋出 FileNotFoundError
。
解決方法:
- 確保文件路徑正確。
- 使用異常處理捕獲錯誤:
try:with open('pi.txt', 'r') as file_object:contents = file_object.read()print(contents)
except FileNotFoundError:print("文件未找到,請檢查路徑是否正確。")
文件模式錯誤
如果文件模式不正確(例如以寫入模式打開只讀文件),會拋出錯誤。
解決方法:
- 確保文件模式與操作匹配。
- 使用異常處理捕獲錯誤。