文件读写完全指南:文本、二进制、编码你会了吗?
作者:FeiLink
文件操作是 Python 编程中的核心技能之一,无论是日志系统、数据导入、模型训练还是用户配置管理,都离不开文件的读写操作。本章将全面讲解文本与二进制文件的读写方式、编码处理技巧,以及常见错误与调试方法,助你打通 Python 文件操作的任督二脉!
📘 一、文件打开模式详解
Python 使用内置函数 open()
进行文件操作:
open(file, mode='r', encoding=None)
常用 mode
模式如下:
模式 | 含义 |
---|---|
'r' | 只读模式(默认) |
'w' | 写入模式,文件不存在会创建,存在则清空 |
'a' | 追加写入模式 |
'rb' | 以二进制方式读取文件 |
'wb' | 以二进制方式写入文件 |
'r+' | 可读可写,不清空内容 |
📝 二、读写文本文件
写入文本:
with open("example.txt", "w", encoding="utf-8") as f:
f.write("Hello, Python!\n")
f.write("欢迎来到文件世界。")
读取文本:
with open("example.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
按行读取:
with open("example.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
💾 三、操作二进制文件
例如图片、音频、模型文件等,都需要以二进制方式读取:
# 读取二进制文件
with open("image.jpg", "rb") as f:
data = f.read()
# 写入二进制数据
with open("copy.jpg", "wb") as f:
f.write(data)
🔁 四、文件的读写组合模式
同时读写一个文件:
with open("data.txt", "r+", encoding="utf-8") as f:
content = f.read()
f.write("\n---追加内容---")
注意:
r+
模式不会清空原文件内容,但写入位置取决于当前指针位置。
🧩 五、编码问题详解与解决方案
常见问题:
UnicodeDecodeError: 'gbk' codec can't decode byte ...
正确处理方式:
始终明确指定 encoding
:
# 推荐
with open("file.txt", "r", encoding="utf-8") as f:
...
如果不确定文件编码,可以使用 chardet
自动识别:
pip install chardet
import chardet
with open("unknown.txt", "rb") as f:
result = chardet.detect(f.read(100))
print(result)
🛠 六、常见错误与调试技巧
错误类型 | 可能原因 | 解决方法 |
---|---|---|
FileNotFoundError | 文件路径错误或文件不存在 | 检查路径拼写或是否存在 |
PermissionError | 没有权限 | 尝试以管理员运行 |
UnicodeDecodeError | 编码不一致 | 显式指定 encoding |
ValueError: I/O operation on closed file | 操作已关闭的文件对象 | 使用 with 语句管理资源 |
📦 七、实战项目:日志分析器(文本读写 + 编码处理)
项目背景: 公司服务器每天产生数万条日志,现在要读取这些日志文件,提取出包含 ERROR
的行,并输出到新文件中,供开发排查问题。
def extract_errors(log_file, output_file):
with open(log_file, "r", encoding="utf-8") as f_in, \
open(output_file, "w", encoding="utf-8") as f_out:
for line in f_in:
if "ERROR" in line:
f_out.write(line)
extract_errors("server.log", "error_summary.log")
扩展任务(高级功能):
- 加入时间过滤(只取今天的错误)
- 使用正则提取错误代码
- 输出统计信息:共多少个错误
❌ 错误示例分析:忘记关闭文件
错误示范:
f = open("data.txt", "r")
print(f.read())
# 忘记 f.close()
可能造成:
- 文件资源未释放
- 写入内容丢失
- 文件锁问题
✅ 改进方式:
with open("data.txt", "r") as f:
print(f.read())
🧠 面试常考点汇总
open()
的默认编码和默认模式是什么?r+
和w+
的区别?- 为什么推荐使用
with open()
? - 如何处理大文件(比如 10GB 日志)?
- 文本文件转二进制时需要注意什么?
🚀 拓展建议
- 使用
pathlib
进行跨平台文件路径处理 - 使用
csv
、json
、pickle
等模块进行格式化读写 - 学习使用
gzip
、zipfile
对文件进行压缩与解压
📌 总结
- 掌握
open()
各种模式的用法是基础 - 编码问题是文件操作中最常见的“坑”,需特别注意
- 使用
with open()
是 Pythonic 的推荐方式 - 实战案例可以极大提升对文件处理的理解和掌握
本文部分内容由 AI 辅助生成,并经人工整理与验证,仅供参考学习,欢迎指出错误与不足之处。