文章目錄
- Python 文件操作詳解
- 一、文件操作的基本流程
- 二、文件打開模式詳解
- 1. 基本模式
- 2. 擴展模式
- 3. 模式組合示例
- 三、文件操作方法大全
- 1. 打開和關閉文件
- 2. 讀取文件內容
- 3. 寫入文件內容
- 4. 文件指針操作
- 四、文件編碼處理
- 五、二進制文件操作
- 六、常見文件操作場景
- 1. 文件內容修改
- 2. CSV文件處理
- 3. JSON文件處理
- 七、文件操作最佳實踐
Python 文件操作詳解
文件操作是編程中最基礎也是最重要的功能之一。Python 提供了豐富的文件操作方法,下面我將從基礎到高級,全面詳細地講解 Python 中的文件操作。
一、文件操作的基本流程
文件操作的三個核心步驟:
- 打開文件:建立程序與文件的連接
- 讀寫操作:讀取內容或寫入數據
- 關閉文件:釋放系統資源
[打開文件 open()] → [讀/寫 read()/write()] → [關閉文件 close()]
二、文件打開模式詳解
Python 的 open()
函數支持多種模式,可以通過組合使用實現不同功能:
1. 基本模式
模式 | 描述 | 文件指針位置 | 文件存在 | 文件不存在 |
---|---|---|---|---|
‘r’ | 只讀 | 文件開頭 | 正常打開 | 報錯 FileNotFoundError |
‘w’ | 寫入 | 文件開頭 | 清空內容 | 創建新文件 |
‘a’ | 追加 | 文件末尾 | 保留內容 | 創建新文件 |
‘x’ | 創建 | 文件開頭 | 報錯 FileExistsError | 創建新文件 |
2. 擴展模式
模式 | 描述 | 常組合的模式 |
---|---|---|
‘b’ | 二進制模式 | ‘rb’, ‘wb’, ‘ab’ |
‘t’ | 文本模式(默認) | ‘rt’, ‘wt’, ‘at’ |
‘+’ | 讀寫模式 | ‘r+’, ‘w+’, ‘a+’ |
3. 模式組合示例
# 文本模式讀寫(默認)
f = open('file.txt', 'r') # 等同于 'rt'# 二進制模式讀寫
f = open('image.png', 'rb')# 讀寫模式(可讀可寫)
f = open('data.txt', 'r+') # 讀寫,文件必須存在
f = open('data.txt', 'w+') # 讀寫,會清空文件
f = open('data.txt', 'a+') # 讀寫,追加模式
三、文件操作方法大全
1. 打開和關閉文件
# 基本打開方式
f = open('example.txt', 'r')
try:# 文件操作content = f.read()
finally:f.close() # 必須確保文件被關閉# 推薦使用 with 語句(上下文管理器)
with open('example.txt', 'r') as f:content = f.read()
# 離開 with 塊后文件自動關閉
2. 讀取文件內容
方法 | 描述 | 適用場景 |
---|---|---|
read(size) | 讀取size字節/字符,不指定則讀取全部 | 小文件讀取 |
readline() | 讀取一行 | 逐行處理 |
readlines() | 讀取所有行,返回列表 | 需要所有行時 |
迭代文件對象 | 逐行讀取 | 大文件處理 |
# 讀取整個文件
with open('example.txt', 'r') as f:content = f.read() # 全部內容作為一個字符串# 逐行讀取(內存友好)
with open('large_file.txt', 'r') as f:for line in f: # 文件對象是可迭代的print(line.strip()) # 去除首尾空白字符# 讀取特定字節數
with open('binary.data', 'rb') as f:chunk = f.read(1024) # 讀取1024字節while chunk: # 循環讀取直到文件結束process(chunk)chunk = f.read(1024)
3. 寫入文件內容
方法 | 描述 | 注意點 |
---|---|---|
write(str) | 寫入字符串 | 不會自動加換行 |
writelines(seq) | 寫入字符串序列 | 序列中的字符串不會被自動處理 |
# 寫入字符串
with open('output.txt', 'w') as f:f.write("Hello, World!\n") # 需要手動添加換行符f.write("這是第二行內容\n")# 寫入多行
lines = ["第一行\n", "第二行\n", "第三行\n"]
with open('lines.txt', 'w') as f:f.writelines(lines) # 注意:不會自動添加換行符# 追加內容
with open('log.txt', 'a') as f:f.write("新的日志條目\n")
4. 文件指針操作
文件對象維護一個指針,指示當前讀寫位置:
方法 | 描述 |
---|---|
tell() | 返回當前指針位置 |
seek(offset, whence) | 移動指針到指定位置 |
whence
參數:
- 0: 文件開頭(默認)
- 1: 當前位置
- 2: 文件末尾
with open('example.txt', 'rb+') as f: # 必須用二進制模式才能使用非0的whenceprint(f.tell()) # 0,文件開頭f.seek(5) # 移動到第5字節print(f.tell()) # 5f.seek(3, 1) # 從當前位置再移動3字節print(f.tell()) # 8f.seek(-2, 2) # 移動到文件末尾前2字節print(f.tell()) # 文件總長度-2
四、文件編碼處理
文本文件需要指定正確的編碼,常見編碼:
- UTF-8(推薦)
- GBK(中文Windows常用)
- ASCII(僅基礎英文)
# 讀取不同編碼的文件
with open('gbk_file.txt', 'r', encoding='gbk') as f:content = f.read()# 寫入指定編碼的文件
with open('utf8_file.txt', 'w', encoding='utf-8') as f:f.write("這是UTF-8編碼的內容")# 處理編碼錯誤(遇到無法解碼的字符時)
with open('problematic.txt', 'r', encoding='utf-8', errors='ignore') as f:content = f.read() # 忽略無法解碼的字符
# 其他errors參數:'replace'(用?替代), 'strict'(默認,拋出異常)
五、二進制文件操作
處理圖片、音頻、視頻等非文本文件:
# 復制二進制文件
with open('source.jpg', 'rb') as src, open('copy.jpg', 'wb') as dst:dst.write(src.read())# 分塊讀取大文件
CHUNK_SIZE = 1024 * 1024 # 1MB
with open('large_video.mp4', 'rb') as f:while True:chunk = f.read(CHUNK_SIZE)if not chunk: # 讀取結束breakprocess_chunk(chunk)
六、常見文件操作場景
1. 文件內容修改
# 修改文件中的特定內容
with open('config.ini', 'r+') as f:lines = f.readlines()f.seek(0) # 回到文件開頭for line in lines:if line.startswith('timeout='):f.write('timeout=300\n') # 修改配置else:f.write(line)f.truncate() # 截斷文件,確保刪除舊內容
2. CSV文件處理
import csv# 讀取CSV文件
with open('data.csv', 'r', newline='') as f:reader = csv.reader(f)for row in reader:print(row)# 寫入CSV文件
data = [['Name', 'Age'], ['Alice', 25], ['Bob', 30]]
with open('output.csv', 'w', newline='') as f:writer = csv.writer(f)writer.writerows(data)
3. JSON文件處理
import json# 讀取JSON文件
with open('data.json', 'r') as f:data = json.load(f)print(data['key'])# 寫入JSON文件
data = {'name': 'Alice', 'age': 25, 'skills': ['Python', 'Java']}
with open('output.json', 'w') as f:json.dump(data, f, indent=4) # indent參數美化輸出
七、文件操作最佳實踐
- 總是使用 with 語句:確保文件正確關閉,即使發生異常
- 處理大文件要分塊:避免內存不足,使用迭代或分塊讀取
- 明確指定編碼:特別是跨平臺應用,默認使用UTF-8
- 檢查文件存在性:操作前檢查
os.path.exists()
或捕獲異常 - 注意換行符差異:Windows(
\r\n
), Linux/macOS(\n
), 使用newline=''
控制 - 二進制模式處理行尾:二進制模式下不會轉換行尾符
# 綜合最佳實踐示例
import os
from pathlib import Pathfile_path = Path('data') / 'important.txt'try:with open(file_path, 'r+', encoding='utf-8', newline='') as f:# 讀取內容content = f.read()# 處理內容modified = content.replace('old', 'new')# 寫回文件f.seek(0)f.write(modified)f.truncate() # 確保刪除舊內容except FileNotFoundError:print(f"錯誤:文件 {file_path} 不存在")
except PermissionError:print(f"錯誤:沒有權限訪問 {file_path}")
except UnicodeDecodeError:print(f"錯誤:文件編碼問題,嘗試其他編碼")
通過以上詳細講解,你應該對Python文件操作有了全面的了解。記住,文件操作是編程基礎,熟練掌握這些方法對日常開發非常有幫助!