Python文件读写操作详解
本文详细解析Python文件读写的核心流程,从open()函数的常用模式切入,重点讲解利用with语句实现自动资源回收的安全语法。涵盖read系列读取API、write方法写入技巧及二进制操作注意事项,最后通过日志管理脚本演示完整的工程化应用,助力开发者高效处理文本与数据文件。
一、 掌握文件打开与模式选择
Python 中进行文件交互的基础是 open() 函数。调用该函数会返回一个文件对象,后续所有操作均基于此对象展开。其核心参数如下:
file:文件路径(支持相对路径或绝对路径)。mode:打开模式,决定数据的流向与权限。
open(file, mode)
常用操作模式对照表
| 模式组合 | 功能说明 |
|---|---|
r | 只读(默认)。文件不存在则抛出FileNotFoundError。 |
w | 覆盖写。存在则清空内容,不存在则新建。⚠️覆盖模式会直接删除原有数据,写入前请务必确认或备份。 |
a | 追加写。在文件末尾写入新内容,不存在则创建。 |
x | 独占创建。若目标已存在,抛出FileExistsError,用于防止重复初始化。 |
b | 二进制模式。用于图片、音频或非结构化数据流处理。 |
t | 文本模式(默认)。默认按字符流处理,建议显式声明encoding参数。 |
r+ / w+ / a+ | 同时具备读写或追加能力。其中w+同样会清空原文件。 |
二、 使用 with 语句安全释放资源
传统操作中需手动调用 file.close() 释放系统句柄。若中途发生异常导致代码中断,文件将处于未关闭状态并可能引发内存占用或锁死。推荐使用上下文管理器 with 语句:
# 标准语法结构
with open('文件路径', '操作模式', encoding='utf-8') as 变量名:
# 在此缩进块内执行读写操作
pass
一旦退出 with 代码块,Python 会自动触发清理动作。无论块内是否抛出异常,均能保证底层文件描述符被正确回收,代码更简洁且健壮。
三、 精准读取文件内容
根据业务场景,可选择不同粒度的读取方式。假设测试文件 example.txt 包含5行文本:
# 预置测试数据
hello world
hello world
hello world
hello world
hello world
1. read() 全文读取
一次性加载全部内容至内存,返回完整字符串。适用于体积较小的配置文件或短文本。
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
2. readline() 逐行读取
每次调用仅获取当前指针位置的一行数据(末尾含 \n),适合需要逐行校验或延迟加载的场景。
with open('example.txt', 'r', encoding='utf-8') as f:
line_1 = f.readline()
print(line_1.strip()) # 清除首尾空白后输出第一行
3. readlines() 列表读取
读取全量数据并按换行符切分,返回包含各行字符串的列表。每行末尾默认保留回车符。
with open('example.txt', 'r', encoding='utf-8') as f:
lines_list = f.readlines()
print(lines_list) # 输出: ['hello world\n', ...]
四、 灵活写入与追加数据
1. 文本写入与覆盖控制
write() 接收单个字符串。若需多行输出,必须显式传入换行符 \n,否则内容将粘连在同一行。
# 覆盖写入示例
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('Hello, Python!\nThis is line two.')
# 追加写入示例
with open('output.txt', 'a', encoding='utf-8') as f:
f.write('\nAppended new content safely.')
2. 批量写入 writelines()
接收字符串迭代对象(如列表),不自动添加换行符,需手动维护分隔符以避免格式混乱。
data_block = ['Row A\n', 'Row B\n']
with open('batch_out.txt', 'w', encoding='utf-8') as f:
f.writelines(data_block)
3. 二进制操作 (wb / ab)
处理 .jpg、.mp3 或网络协议数据流时需切换至二进制模式。此时传入的数据类型必须为 bytes,传入普通字符串会触发 TypeError。
binary_data = b'\xFF\xD8\xFF\xE0' # 模拟JPEG文件头字节
with open('header.jpg', 'wb') as f:
f.write(binary_data)
五、 完整案例:轻量级日志管理器
在实际工程中,常需将运行轨迹持久化。以下代码封装了标准的日志读写逻辑,兼顾安全性、可读性与复用性。
import os
def append_log(msg: str):
"""追加单条日志到 logfile.txt"""
path = 'logfile.txt'
with open(path, 'a', encoding='utf-8') as lf:
timestamp = os.popen('date +"%Y-%m-%d %H:%M:%S"').read().strip()
lf.write(f"[{timestamp}] {msg}\n")
def fetch_logs():
"""读取全部历史日志并返回列表"""
if not os.path.exists('logfile.txt'):
return []
with open('logfile.txt', 'r', encoding='utf-8') as lf:
return lf.readlines()
# 模拟业务流转记录
append_log('用户登录成功')
append_log('数据库查询超时')
# 检索并打印脱敏日志
print(fetch_logs())
六、 操作总结与排错建议
- 权限与占用检查:若控制台抛出
PermissionError,通常因文件正被 Excel、IDE 或杀毒软件锁定。关闭关联进程后重试即可恢复写入。 - 编码匹配原则:现代项目统一使用
utf-8。读取老旧系统导出的报表时若出现乱码,请尝试切换gbk或latin-1解码器。 - 大数据流式处理:处理数 GB 的日志或 CSV 时严禁使用
read(),应采用for line in f:迭代器逐行扫描,防止 OOM(内存溢出)崩溃。
以上就是Python文件读写操作详解的详细内容,更多关于Python文件读写操作的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









