Python文件讀寫with的本質(zhì)示例詳解
文件讀寫是日常開發(fā)中非常常見的一類操作,無論是處理日志、配置文件,還是接口數(shù)據(jù)落地,都離不開 I/O。
基礎(chǔ):open / read / write
Python 中通過 open() 打開文件,返回一個文件對象:
# 打開文件(只讀模式)
f = open("test.txt", "r", encoding="utf-8")
content = f.read()
print(content)
f.close()
常見模式包括:
"r":只讀(默認)"w":寫入(會覆蓋原內(nèi)容)"a":追加寫入"rb"/"wb":二進制模式
寫文件示例:
f = open("output.txt", "w", encoding="utf-8")
f.write("Hello, Python I/O")
f.close()
這里需要注意兩點:
- 忘記
close()可能導(dǎo)致資源未釋放; "w"模式會清空文件內(nèi)容。
文本文件處理
實際開發(fā)中,更常見的是逐行處理文本:
f = open("test.txt", "r", encoding="utf-8")
for line in f:
print(line.strip())
f.close()
相比 read() 一次性讀取全部內(nèi)容,這種方式更適合內(nèi)容較多的文件。
with 語句(上下文管理)
with 語句可以自動管理文件資源,無需手動關(guān)閉:
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
等價于:
- 打開文件
- 使用文件
- 自動調(diào)用
close()
with 是處理文件的標準寫法,塊結(jié)束后自動關(guān)閉文件,哪怕中間拋了異常。在實際開發(fā)中,它可以避免資源泄露問題。
處理大文件(逐行讀?。?/h2>
如果文件有幾百 MB,一次性 read() 進內(nèi)存會很危險。推薦使用逐行讀取方式:
with open("big_file.txt", "r", encoding="utf-8") as f:
for line in f:
process(line)
或者更細粒度控制:
with open("big_file.txt", "r", encoding="utf-8") as f:
while True:
line = f.readline()
if not line:
break
process(line)
這種方式只會在內(nèi)存中保留當(dāng)前行,適合日志分析、數(shù)據(jù)清洗等場景。
JSON 文件讀寫(高頻)
接口返回值、配置文件、爬蟲結(jié)果,很多場景都是 JSON 格式。Python 內(nèi)置的 json 模塊直接搞定:
讀取 JSON:
import json
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data)
寫入 JSON:
import json
data = {"name": "Alice", "age": 18}
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
參數(shù)說明:
ensure_ascii=False:避免中文被轉(zhuǎn)義indent=2:美化輸出格式
總結(jié)
本篇的核心可以歸納為三點:
- 基礎(chǔ)操作:
open / read / write - 推薦寫法:使用
with管理文件資源 - 常見場景:大文件處理 + JSON 讀寫
文件 I/O 本身不復(fù)雜,但在工程中幾乎無處不在。熟悉這些模式后,可以直接應(yīng)用到日志處理、數(shù)據(jù)落地、接口調(diào)試等多個場景中。
with 的本質(zhì):上下文管理器
with 并不只用于文件讀寫,它的本質(zhì)是上下文管理(context management)機制。文件只是一個常見應(yīng)用場景。可以把它理解為:在一段代碼執(zhí)行前后,自動做“準備”和“收尾”工作。with 語句依賴一個對象,這個對象需要實現(xiàn)兩個方法:
__enter__() __exit__()
執(zhí)行流程是:
with obj as x:
# 執(zhí)行代碼塊
等價于:
x = obj.__enter__()
try:
# 執(zhí)行代碼塊
finally:
obj.__exit__()
也就是說:
enter():進入時執(zhí)行(資源初始化)exit():退出時執(zhí)行(資源釋放)
with的其他用法
線程鎖(非常常見)
import threading
lock = threading.Lock()
with lock:
# 臨界區(qū)代碼
print("線程安全操作")
作用:
- 自動加鎖(enter)
- 自動釋放鎖(exit)
避免忘記 release() 導(dǎo)致死鎖。
數(shù)據(jù)庫連接 / 事務(wù)管理
很多數(shù)據(jù)庫庫支持:
with connection:
cursor.execute("INSERT INTO table VALUES (1)")
或者:
with connection.cursor() as cursor:
cursor.execute("SELECT * FROM table")
作用:
- 自動提交或回滾事務(wù)
- 自動關(guān)閉 cursor
臨時修改環(huán)境(如上下文切換)
from decimal import localcontext, Decimal
with localcontext() as ctx:
ctx.prec = 2
print(Decimal("1.12345") + Decimal("2.34567"))
print(Decimal("1.12345") + Decimal("2.34567"))
作用:
- 在
with內(nèi)修改配置 - 退出后恢復(fù)原狀態(tài)
自定義上下文管理器
可以自己定義 with 的行為:
class Timer:
def __enter__(self):
import time
self.start = time.time()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
import time
print("耗時:", time.time() - self.start)
with Timer():
sum(range(1000000))
用途:
- 統(tǒng)計耗時
- 日志記錄
- 資源管理
更優(yōu)雅的寫法:contextlib
Python 提供了更簡潔的方式:
from contextlib import contextmanager
import time
@contextmanager
def timer():
start = time.time()
yield
print("耗時:", time.time() - start)
with timer():
sum(range(1000000))
相比寫類:
- 更少代碼
- 更直觀
總結(jié)
with 的核心不是“文件操作”,而是讓“必須成對出現(xiàn)的操作”(獲取/釋放、開始/結(jié)束)變得安全且簡潔
常見組合包括:
- 打開 / 關(guān)閉(文件)
- 加鎖 / 解鎖(線程)
- 開始 / 提交(數(shù)據(jù)庫)
- 設(shè)置 / 恢復(fù)(環(huán)境)
到此這篇關(guān)于Python文件讀寫with本質(zhì)的文章就介紹到這了,更多相關(guān)Python文件讀寫with內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3 selenium 實現(xiàn)QQ群接龍自動化功能
這篇文章主要介紹了Python3 selenium 實現(xiàn)QQ群接龍自動化功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
python mysql實現(xiàn)學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了python mysql實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
關(guān)于python的縮進規(guī)則的知識點詳解
在本篇文章里小編給大家整理了關(guān)于python的縮進規(guī)則的知識點詳解,有興趣的朋友們可以學(xué)習(xí)下。2020-06-06

