📂 Python 文件操作:高效读写与错误处理

Evan Zhou

Tech Chronicles|Feb 1, 2025|Last edited: Oct 17, 2025|
type
status
date
slug
summary
tags
category
icon
password
comment
在 Python 开发中,文件操作 是必不可少的技能之一。无论是读取数据、存储结果、处理日志,还是与外部程序交互,我们都需要高效、稳定地管理文件。本篇文章将系统介绍 Python 文件操作的完整流程,包括 文件检测、写入、读取、异常处理,帮助你掌握实战技巧。

1. 认识 Python 文件操作

在 Python 中,文件操作 是数据存储和处理的重要技能。Python 提供了 内置 open() 函数 来进行文件的读取(Read)、写入(Write)、追加(Append)等操作,并支持不同的模式以满足各种需求。

🔹 Python 文件模式

在打开文件时,我们需要指定文件模式,决定如何操作文件:
模式
描述
文件不存在时的行为
"r"
只读模式(默认),只能读取,不可修改
报错
"w"
写入模式,清空原文件内容,写入新内容
创建新文件
"a"
追加模式,在文件末尾添加内容
创建新文件
"x"
创建模式,仅用于创建新文件,文件已存在时报错
报错
"b"
二进制模式(用于图片、音频、视频等)
-
"t"
文本模式(默认,适用于普通文本文件)
-
💡 二进制模式(b)与文本模式(t
  • 文本模式(默认):适用于 .txt 文件,处理字符串数据(str)。
  • 二进制模式(b:适用于 .jpg.png.mp3 等文件,处理字节数据(bytes)。
🔹 模式可以组合使用
  • "rb":以 二进制模式 读取文件
  • "wb":以 二进制模式 写入文件
  • "rt":以 文本模式 读取文件(默认)
  • "wt":以 文本模式 写入文件(默认)
选择合适的模式,确保文件操作符合预期!

2. 检测文件是否存在

在对文件进行 读取、写入或删除 之前,先确认文件是否存在 是一个良好的实践。否则,尝试访问一个不存在的文件会导致 FileNotFoundError 异常。
Python 提供了 两种主要方法 来检查文件是否存在:

🔹 方法 1:使用 os.path.exists()

💡 优点
  • 兼容 Python 2 和 3,适用于所有 Python 版本。
  • 也可以用于检测 文件夹 是否存在(如 os.path.exists("my_folder"))。

🔹 方法 2:使用 pathlib(推荐)

pathlib 模块是 Python 3.4+ 引入的 面向对象路径操作库,相比 os 更加直观。
💡 为什么推荐 pathlib
  • 代码更清晰,面向对象的 API 更直观。
  • 功能更强大,可以轻松处理 文件路径、目录操作、文件属性检查 等。
  • 仅支持 Python 3.4+,如果使用 Python 2,则需使用 os.path.exists()
最佳实践
  • 如果是 简单检查文件是否存在,推荐 pathlib
  • 如果需要兼容 Python 2,使用 os.path.exists()

3. 写入文件(Write)

Python 提供多种写入文件的方法,包括覆盖写入、追加写入、多行写入等。不同模式适用于不同需求。

🔹 覆盖写入模式(w

🔹 特点:
  • 清空文件内容(如果文件已存在)。
  • 适用于:需要 重新写入 文件的场景,如日志初始化、配置文件重置等。

🔹 追加写入模式(a

🔹 特点:
  • 不会覆盖原有内容,而是 在文件末尾添加 新数据。
  • 适用于:日志记录、数据累积写入等场景。

🔹 一次性写入多行(writelines()

如果需要写入 多行文本,可以使用 writelines(),避免多次 write() 调用,提高性能。
🔹 特点:
  • 适合批量写入 列表或其他可迭代对象 的文本数据。
  • 但需要 手动添加换行符 \n,否则所有内容会写在同一行。
最佳实践
  • 需要清空文件后写入新内容 → 使用 "w" 模式。
  • 需要在文件末尾追加内容 → 使用 "a" 模式。
  • 写入多行数据 → 使用 writelines() 提高效率。

4. 读取文件(Read)

Python 提供了多种方法读取文件内容,根据文件大小和需求选择合适的方法。

🔹 读取整个文件内容(read()

read() 方法 一次性读取整个文件,适用于 小型文本文件
🔹 特点:
  • 适用于 小型文件(几 KB 级别)。
  • 可能 占用大量内存,不适用于 大文件(如日志文件)。

🔹 按行读取(readline()readlines()

如果需要逐行处理文件,Python 提供了 readline()readlines() 两种方式。
🔹 区别:
  • readline() 每次读取一行,适用于 逐行处理大文件,避免内存占用过高。
  • readlines() 一次性读取所有行,并返回列表,适用于 小型文件

🔹 使用 for 逐行读取(推荐)

对于 大文件,推荐使用 for 循环 逐行读取,这样不会一次性加载整个文件,更加节省内存
🔹 特点:
  • 高效、节省内存,适用于 大文件处理
  • 逐行处理,便于数据分析、日志解析等场景。
最佳实践
  • 小文件read() 适用于 一次性加载所有内容
  • 逐行处理readline() 适用于 读取特定行
  • 批量读取readlines() 适用于 小型文件,按行存储为列表
  • 大文件推荐 for 逐行读取,节省内存,适用于日志解析等任务。

5. 处理文件操作异常

在文件操作过程中,可能会遇到:
  • 文件不存在FileNotFoundError
  • 权限不足PermissionError
  • 文件损坏或不可读OSError
使用 异常处理(try-except 可以 避免程序崩溃,并提供友好的错误信息。

🔹 使用 try-except 捕获文件异常

这样即使文件不存在或出现错误,程序也不会崩溃,而是友好地给出提示信息。

🔹 finally 确保文件正确关闭

finally 语句可确保 无论是否发生异常,文件都会被正确关闭。但 with open() 语句会自动管理文件,无需手动关闭。
最佳实践
  • 推荐使用 with open(),它 自动管理文件关闭,即使异常发生,也不会导致文件泄露。
  • 仅在 with 不能使用的特殊情况(如手动打开多个文件)时,才使用 try-finally 关闭文件。

6. 处理不同类型的文件

Python 不仅可以处理 文本文件,还可以读写 CSV、JSON、二进制文件(如图片、音频) 等。

📝 1. 处理 CSV 文件

CSV(Comma-Separated Values,逗号分隔值) 是常见的表格格式,Python 提供 csv 模块进行读写操作。

📌 写入 CSV 文件

💡 说明
  • csv.writer(file) 创建 CSV 写入器
  • writer.writerows(data) 写入多行数据,数据格式为嵌套列表

📌 读取 CSV 文件

💡 说明
  • csv.reader(file) 创建 CSV 读取器
  • CSV 默认按行读取,每行返回一个列表
适用于:数据表、日志、Excel 导出文件等。

📜 2. 处理 JSON 文件

JSON(JavaScript Object Notation) 是一种轻量级的数据格式,广泛用于数据交换(如 API)。
Python 提供 json 模块,轻松处理 JSON 数据。

📌 写入 JSON 文件

💡 说明
  • json.dump(data, file, ensure_ascii=False, indent=4)
    • ensure_ascii=False 确保中文正常存储
    • indent=4 格式化 JSON 结构,易于阅读

📌 读取 JSON 文件

💡 说明
  • json.load(file) 解析 JSON 文件,转换为 Python 字典
  • 适用于 配置文件、API 数据存储等

🖼 3. 处理二进制文件(图片、音频、视频)

对于图片、音频、视频等二进制文件,使用 "rb"(读取)和 "wb"(写入)模式。

📌 复制图片文件

💡 说明
  • 二进制模式(rb / wb:用于非文本文件,防止编码问题。
  • src_file.read() 读取整个文件内容,然后 write() 写入新文件
适用于:图片处理、音频处理、视频存储等。

🔬 4. 处理大文件(逐步读取)

对于大文件(如日志、数据库备份),一次性 read() 会占用大量内存。
推荐 逐行读取,避免内存溢出。

📌 按行读取大文件


总结

文件类型
读取方法
写入方法
适用场景
文本文件
read() / readline() / for line in file
write() / writelines()
文章、日志
CSV 文件
csv.reader(file)
csv.writer(file).writerows(data)
表格、数据分析
JSON 文件
json.load(file)
json.dump(data, file, indent=4)
配置、API 交互
二进制文件
open(file, "rb")
open(file, "wb")
图片、音频、视频
大文件
for line in file:
write()
日志、数据库导出

总结:Python 文件操作核心方法

操作
方法
适用场景
特点
检测文件是否存在
os.path.exists() / Path.exists()
任何文件或目录
适用于检查文件是否存在,避免 FileNotFoundError
写入文件(覆盖模式)
open("file.txt", "w")
需要完全替换内容时
会清空原文件内容,如文件不存在则创建
追加写入
open("file.txt", "a")
在文件末尾追加内容
保留原有内容,不会覆盖
读取整个文件
file.read()
适用于小型文本文件
一次性加载整个文件内容,可能占用较多内存
逐行读取
file.readline() / file.readlines()
适用于中小型文件
readline() 逐行读取,readlines() 返回所有行列表
推荐读取方式
for line in file:
适用于大文件
按行迭代,节省内存,处理大文件更高效
异常处理
try-except 结构
任何可能出错的文件操作
捕获 FileNotFoundErrorPermissionError 等,防止程序崩溃
处理 CSV 文件
csv.reader() / csv.writer()
结构化数据
适用于表格数据,如日志、报表
处理 JSON 文件
json.load() / json.dump()
配置文件、API 数据
适用于存储 Python 字典等结构化数据
处理二进制文件
open(file, "rb") / open(file, "wb")
图片、音频、视频
以二进制模式打开,防止编码错误
大文件处理
for line in file:
处理超大日志、数据文件
逐行读取,避免一次性加载占用过多内存
掌握这些文件操作方法,让你的 Python 代码更高效、更稳定!🚀

⏭️ 下一节预告:🚀 Python 并发编程:释放计算与 I/O 的潜能

在下一篇文章中,我们将深入探讨 Python 多线程(Threading)、多进程(Multiprocessing)与异步编程(AsyncIO),学习如何让 Python 高效执行并发任务,加快代码运行速度。
🎯 你将学习:
  • 多线程(Threading):如何在 Python 中创建和管理线程
  • 多进程(Multiprocessing):如何利用 CPU 多核加速任务执行
  • 异步编程(AsyncIO):如何提高 I/O 任务的并发能力
  • 并发模型的选择:如何根据应用场景决定 线程、进程或异步 方案
🚀 掌握并发编程,让你的 Python 代码跑得更快!敬请期待!
 
Loading...