Python 的文件 I/O 操作是數據處理的基礎技能,涉及文件的讀寫、路徑管理、異常處理等核心功能。以下是文件 I/O 的核心知識點:
一、基礎文件操作
1. 打開文件
# 通用模式:r(讀)/w(寫)/a(追加) + b(二進制)/t(文本,默認)
f = open("data.txt", "r", encoding="utf-8") # 文本模式讀取
f = open("image.jpg", "rb") # 二進制模式讀取
2. 關閉文件
f.close() # 顯式關閉(需確保執行)# 推薦方式:使用 with 語句自動關閉
with open("data.txt", "r") as f:content = f.read()
# 此時文件已自動關閉
二、文件讀寫模式
模式 | 描述 | 行為 |
---|---|---|
r | 讀取(默認) | 文件必須存在 |
w | 寫入 | 覆蓋已存在文件,不存在則創建 |
a | 追加 | 文件末尾寫入,不存在則創建 |
r+ | 讀寫 | 文件必須存在 |
w+ | 讀寫 | 覆蓋已存在文件,不存在則創建 |
b | 二進制模式 | 與其他模式組合使用(如 rb ) |
三、文件內容操作
1. 讀取內容
with open("data.txt", "r") as f:# 讀取全部內容full_text = f.read()# 逐行讀取(生成器)for line in f:print(line.strip())# 讀取指定大小chunk = f.read(1024) # 讀取1KB
2. 寫入內容
with open("output.txt", "w") as f:f.write("Hello, World!\n") # 寫入字符串f.writelines(["Line1\n", "Line2\n"]) # 寫入多行
四、文件路徑處理
1. 路徑操作
import os# 拼接路徑(跨平臺安全)
file_path = os.path.join("folder", "subfolder", "file.txt")# 獲取絕對路徑
abs_path = os.path.abspath("data.txt")# 檢查文件存在性
if os.path.exists("data.txt"):print("文件存在")
2. 路徑分解
path = "/user/docs/report.pdf"
print(os.path.basename(path)) # → "report.pdf"
print(os.path.dirname(path)) # → "/user/docs"
五、高級文件操作
1. 文件指針控制
with open("data.txt", "r+") as f:f.seek(10) # 移動到第10字節f.write("X") # 覆蓋寫入f.seek(0) # 返回文件開頭print(f.read())
2. 二進制文件處理
# 讀取圖片文件
with open("image.jpg", "rb") as f:img_data = f.read()# 寫入二進制數據
with open("copy.jpg", "wb") as f:f.write(img_data)
3. 臨時文件
import tempfilewith tempfile.NamedTemporaryFile(mode="w+t") as tmp:tmp.write("臨時內容")tmp.seek(0)print(tmp.read())
# 臨時文件自動刪除
六、異常處理
try:with open("missing.txt", "r") as f:content = f.read()
except FileNotFoundError:print("文件不存在!")
except PermissionError:print("無訪問權限!")
except IOError as e:print(f"I/O錯誤: {str(e)}")
七、實用技巧
1. 逐行處理大文件
with open("large_log.txt", "r") as f:for line in f:if "ERROR" in line:print(f"發現錯誤: {line.strip()}")
2. CSV 文件操作
import csv# 寫入CSV
with open("data.csv", "w", newline='') as f:writer = csv.writer(f)writer.writerow(["Name", "Age"])writer.writerow(["Alice", 30])# 讀取CSV
with open("data.csv", "r") as f:reader = csv.reader(f)for row in reader:print(row)
3. JSON 文件操作
import jsondata = {"name": "Bob", "age": 25}# 寫入JSON
with open("data.json", "w") as f:json.dump(data, f, indent=2)# 讀取JSON
with open("data.json", "r") as f:loaded_data = json.load(f)
八、性能優化
-
緩沖區控制:
# 增大緩沖區提升大文件讀寫性能 with open("data.txt", "r", buffering=65536) as f:pass
-
內存映射文件:
import mmapwith open("large_file.bin", "r+b") as f:mm = mmap.mmap(f.fileno(), 0)mm[1024:1028] = b"TEST" # 直接修改內存映射mm.close()
九、常見陷阱
-
文件未關閉:
# 錯誤示例:異常導致文件未關閉 f = open("data.txt", "r") # ... 可能拋出異常的代碼 ... f.close() # 可能無法執行
-
路徑分隔符:
# 錯誤示例:硬編碼路徑分隔符 bad_path = "folder" + "\\" + "file.txt" # Windows特定 # 正確做法:使用os.path.join
-
編碼問題:
# 錯誤示例:未指定編碼導致亂碼 f = open("data.txt", "r") # 使用系統默認編碼 # 正確做法:明確指定encoding參數
通過掌握這些內容,可以高效處理從簡單文本讀寫到復雜二進制數據操作的各種場景。實際應用中需根據需求選擇合適的模式和方法,并特別注意資源管理和異常處理。