Python 文件读取最佳实践
Python 文件读取是数据处理的基础操作,核心围绕 open()
函数展开,结合不同模式、读取方法和上下文管理,可满足各种场景需求。以下是常见方法的总结:
一、核心函数:open()
所有文件读取都依赖 open()
函数打开文件,返回一个文件对象(file object)。
语法:
file _obj = open(file _path, mode='r', encoding=None)
file_path
:文件路径(绝对路径或相对路径)。mode
:打开模式(核心参数,读取相关常用模式如下):
* `'r'`:默认模式,只读(文本模式,读取内容为字符串)。
* `'rb'`:二进制只读(读取内容为 `bytes` 类型,用于图片、音频等非文本文件)。
* `'r+'`:读写模式(可读可写,不常用)。
encoding
:文本模式下指定编码(如'utf-8'
、'gbk'
),避免中文乱码。
二、常用读取方法(文件对象的方法)
文件对象(file_obj
)提供多种读取内容的方法,适用于不同场景:
方法 | 作用 | 适用场景 |
---|---|---|
read(size=-1) | 读取全部内容(size 指定字节数,-1 为全部) | 小文件(内容可一次性加载到内存) |
readline(size=-1) | 读取一行内容(包括换行符 n ) | 逐行处理(如大文件,避免内存占用) |
readlines() | 读取所有行,返回列表(每行作为元素) | 需一次性获取所有行(中等大小文件) |
示例:
# 1. read():读全部内容
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read() # 字符串类型,包含所有内容
print(content)
# 2. readline():逐行读
with open("test.txt", "r") as f:
while True:
line = f.readline() # 读一行,空字符串表示到末尾
if not line:
break
print(line.strip()) # 去除换行符
# 3. readlines():读所有行到列表
with open("test.txt", "r") as f:
lines = f.readlines() # 列表,每个元素是一行(含换行符)
for line in lines:
print(line.strip())
三、高效读取大文件:迭代文件对象
对于大文件(如几 GB 的日志),read()
或 readlines()
会一次性加载全部内容到内存,可能导致内存溢出。此时直接迭代文件对象更高效(逐行读取,内存占用低):
# 迭代文件对象(推荐大文件使用)
with open("large _file.log", "r") as f:
for line in f: # 每次只加载一行到内存
print(line.strip())
四、二进制文件读取(图片、音频等)
非文本文件(如 .png
、.mp3
)需用 'rb'
模式读取,返回 bytes
类型:
# 读取图片(二进制文件)
with open("image.png", "rb") as f:
img _bytes = f.read() # bytes类型,可用于保存或传输
print(type(img _bytes)) # <class 'bytes'>
五、面向对象的读取:pathlib
模块(Python 3.4+)
pathlib
提供更简洁的面向对象 API,替代传统字符串路径操作,读取方法更直观:
from pathlib import Path
# 读取文本文件
path = Path("test.txt")
content = path.read _text(encoding="utf-8") # 等价于 open(..., 'r').read()
# 读取二进制文件
img _bytes = Path("image.png").read _bytes() # 等价于 open(..., 'rb').read()
六、特殊格式文件读取(扩展)
对于 CSV、JSON 等结构化文本文件,Python 提供专用模块:
- CSV 文件:用
csv
模块(处理逗号分隔数据):
import csv
with open("data.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f) # 迭代器,每次返回一行数据(列表)
for row in reader:
print(row)
- JSON 文件:用
json
模块(读取 JSON 格式):
import json
with open("data.json", "r") as f:
data = json.load(f) # 直接解析为字典/列表
七、最佳实践与注意事项
- 优先使用
with
语句:自动关闭文件(即使出错),避免资源泄露(无需手动调用close()
)。 - 指定编码:文本文件读取时显式指定
encoding="utf-8"
(或文件实际编码),避免中文乱码。 - 处理异常:捕获常见错误(如文件不存在、权限不足):
try:
with open("test.txt", "r") as f:
print(f.read())
except FileNotFoundError:
print("文件不存在")
except PermissionError:
print("无权限访问文件")
- 区分文本与二进制:文本模式(
'r'
)返回字符串,二进制模式('rb'
)返回bytes
,不可混用。
总结
- 小文件:
read()
或readlines()
一次性读取。 - 大文件:迭代文件对象(
for line in f
)逐行处理。 - 二进制文件:
'rb'
模式 +read()
。 - 简洁操作:
pathlib.Path
的read_text()
/read_bytes()
。 - 安全规范:始终用
with
语句管理文件,做好异常处理。