Python文件读取最佳实践

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)  # 直接解析为字典/列表

七、最佳实践与注意事项

  1. 优先使用 with 语句:自动关闭文件(即使出错),避免资源泄露(无需手动调用 close())。
  2. 指定编码:文本文件读取时显式指定 encoding="utf-8"(或文件实际编码),避免中文乱码。
  3. 处理异常:捕获常见错误(如文件不存在、权限不足):
try:
   with open("test.txt", "r") as f:
       print(f.read())
except FileNotFoundError:
   print("文件不存在")
except PermissionError:
   print("无权限访问文件")
  1. 区分文本与二进制:文本模式('r')返回字符串,二进制模式('rb')返回 bytes,不可混用。

总结

  • 小文件:read()readlines() 一次性读取。
  • 大文件:迭代文件对象(for line in f)逐行处理。
  • 二进制文件:'rb' 模式 + read()
  • 简洁操作:pathlib.Pathread_text() / read_bytes()
  • 安全规范:始终用 with 语句管理文件,做好异常处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值