文件I/O(输入输出)是Python开发的基础核心能力,所有本地数据持久化、日志存储、配置读取、数据导出都依赖文件操作。相比于内存变量,文件可以永久保存数据、跨程序复用、落地业务数据。
本文全覆盖指定核心知识点:原生open读写操作、上下文管理器with、os/shutil系统文件操作、JSON/CSV标准数据解析。全程搭配可直接运行的实战代码、工程高频坑点、面试真题,一站式掌握Python全场景文件处理方案。
一、Python文件I/O基础认知
文件I/O即文件读写操作,核心分为三步:打开文件 → 读写数据 → 关闭文件。Python内置open函数实现基础文件操作,无需额外安装依赖,支持文本文件、二进制文件读写。
文件分类:
1、文本文件:txt、json、csv、md等,以字符形式存储,可直接阅读;
2、二进制文件:图片、视频、音频、exe程序等,以字节形式存储。
核心原则:打开的文件必须关闭,否则会造成文件句柄泄露、内存占用、文件锁定无法编辑等问题。
二、原生open函数读写详解
open()是Python内置文件操作函数,支持多种读写模式、编码配置、缓冲区设置,是所有文件操作的底层基础。
2.1 open核心语法与读写模式
基础语法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)
工程核心参数:文件路径、读写模式、编码格式(文本文件必配)
常用读写模式对照表:
1、r:只读模式,默认模式,文件不存在直接报错;
2、w:清空写入模式,文件存在清空内容后写入,不存在则新建;
3、a:追加写入模式,文件存在尾部追加内容,不存在则新建;
4、r+:读写模式,不会清空原文件,指针默认在开头;
5、w+:读写模式,先清空文件再读写;
6、b:二进制模式(rb/wb/ab),无需指定编码,用于非文本文件。
2.2 基础读写实战(无with原生写法)
# 1. 文本读取操作
# encoding 指定编码,解决中文乱码(Windows默认gbk,Linux/Mac默认utf-8)
f = open("test.txt", "r", encoding="utf-8")
content = f.read() # 读取全部内容
print(content)
f.close() # 手动关闭文件
# 2. 清空写入操作
f = open("test.txt", "w", encoding="utf-8")
f.write("Hello Python文件读写\n")
f.write("第二行写入内容")
f.close()
# 3. 追加写入操作
f = open("test.txt", "a", encoding="utf-8")
f.write("\n追加一行新数据")
f.close()
2.3 细分读取方法(工程常用)
f = open("test.txt", "r", encoding="utf-8")
# 1. read(n):读取指定字符,无n则读取全部
print(f.read(10))
# 2. readline():读取单行内容
print(f.readline())
# 3. readlines():读取所有行,返回列表
line_list = f.readlines()
print(line_list)
f.close()
2.4 原生写法致命坑点
手动open+close存在严重隐患:如果读写过程中代码报错,close()无法执行,导致文件句柄泄露、资源占用,因此工程中禁止裸写open,统一使用with上下文管理器。
三、上下文管理器 with(工程标准写法)
with 是Python上下文管理器语法,专门用于资源自动管理,文件操作中可以自动关闭文件,无论代码正常执行还是异常报错,都会释放资源,彻底解决句柄泄露问题。
3.1 with标准读写实战
# 标准读取写法
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
print("文件内容:", content)
# 标准追加写入写法
with open("test.txt", "a", encoding="utf-8") as f:
f.write("\nwith上下文管理器写入内容")
# 读写混合模式
with open("test.txt", "r+", encoding="utf-8") as f:
data = f.read()
f.seek(0) # 指针回到开头
f.write("头部新增内容\n" + data)
3.2 上下文管理器核心原理
with本质基于魔法方法 __enter__ 和 __exit__ 实现:
1、进入with代码块:自动执行 __enter__,打开文件资源;
2、退出with代码块(无论正常/异常):自动执行 __exit__,关闭文件、释放资源;
3、无需手动调用close,代码更简洁、安全性更高。
3.3 工程规范总结
所有文件I/O操作,必须使用with上下文管理器,杜绝手动open/close,是企业级代码强制规范。
四、os / shutil 系统文件操作
open仅能实现文件内容读写,文件创建、删除、重命名、文件夹遍历、批量操作需要依赖os和shutil模块,是项目文件批量处理、目录管理的核心工具。
4.1 os模块:目录与基础文件操作
import os
# 1. 获取当前工作目录
print(os.getcwd())
# 2. 创建单层文件夹
os.mkdir("new_folder")
# 3. 递归创建多层文件夹
os.makedirs("a/b/c", exist_ok=True) # exist_ok=True 存在不报错
# 4. 列出目录下所有文件/文件夹
print(os.listdir("./"))
# 5. 文件重命名
os.rename("test.txt", "new_test.txt")
# 6. 删除单个文件
os.remove("new_test.txt")
# 7. 删除空文件夹
os.rmdir("new_folder")
4.2 shutil模块:高级批量文件操作
os仅支持基础操作,shutil提供文件复制、文件夹递归删除、整体移动、打包等高级能力,弥补os短板。
import shutil
# 1. 复制文件
shutil.copy("source.txt", "target.txt")
# 2. 递归复制整个文件夹
shutil.copytree("old_dir", "new_dir")
# 3. 移动文件/文件夹
shutil.move("target.txt", "./new_folder/")
# 4. 递归删除非空文件夹(工程高频)
shutil.rmtree("a")
4.3 高频工程坑点
1、os.rmdir 只能删除空文件夹,非空文件夹必须用 shutil.rmtree;
2、文件路径区分绝对路径和相对路径,跨平台推荐使用os.path拼接;
3、批量操作前建议先判断文件是否存在,避免报错。
4.4 跨平台路径拼接(规范写法)
import os
# 自动适配Windows/Linux路径分隔符,杜绝路径报错
base_path = os.getcwd()
file_path = os.path.join(base_path, "data", "test.txt")
print(file_path)
# 判断文件/文件夹是否存在
print(os.path.exists(file_path))
五、JSON数据解析(结构化数据读写)
JSON是前后端交互、配置文件、数据持久化最常用的结构化格式,Python内置json模块,无需第三方依赖,实现字典与JSON文件的相互转换。
核心对应关系:Python字典 ↔ JSON字符串/文件
5.1 JSON四大核心方法
1、json.dump:Python字典 → 写入JSON文件;
2、json.load:读取JSON文件 → Python字典;
3、json.dumps:字典 → JSON字符串;
4、json.loads:JSON字符串 → 字典。
5.2 JSON文件读写实战
import json
# 1. 字典写入JSON文件
data = {
"name": "Python学习",
"age": 20,
"skill": ["文件操作", "数据解析"],
"is_valid": True
}
# ensure_ascii=False 保留中文,indent=4 格式化缩进
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# 2. 读取JSON文件转为字典
with open("data.json", "r", encoding="utf-8") as f:
res = json.load(f)
print(res)
print(type(res)) # dict
5.3 JSON高频坑点
1、JSON不支持Python元组,元组会被转为列表;
2、JSON无None类型,Python None会转为null;
3、必须指定 ensure_ascii=False,否则中文会被转义为Unicode编码;
4、JSON文件必须是标准JSON格式,注释、多余逗号都会解析报错。
六、CSV数据解析(表格数据读写)
CSV是轻量级表格文件,常用于数据分析、批量数据导入导出,Python内置csv模块,支持批量读写表格数据,无需安装pandas即可实现基础表格操作。
6.1 CSV基础写入
import csv
# 列表数据写入CSV
headers = ["姓名", "年龄", "技能"]
rows = [
["张三", 18, "Python"],
["李四", 20, "Java"],
["王五", 19, "Go"]
]
with open("data.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(headers) # 写入表头
writer.writerows(rows) # 批量写入多行数据
6.2 CSV读取与字典读写(工程常用)
import csv
# 1. 基础读取
with open("data.csv", "r", encoding="utf-8-sig") as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 2. 字典读取(按表头取值,更实用)
with open("data.csv", "r", encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
print(f"姓名:{row['姓名']},年龄:{row['年龄']}")
6.3 CSV核心坑点
1、写入时必须设置 newline="",否则会出现空行;
2、中文乱码需使用 utf-8-sig 编码,适配Windows表格软件;
3、CSV适合轻量表格数据,复杂数据分析优先使用pandas。
七、高频面试真题汇总
题目1:with上下文管理器的作用和原理?
答案:with是资源上下文管理器,基于__enter__和__exit__魔法方法实现,自动打开和关闭文件资源,无需手动close,代码报错也能自动释放资源,避免文件句柄泄露,是文件操作的标准写法。
题目2:r、w、a、r+ 模式的区别?
答案:r只读、文件不存在报错;w清空写入、新建文件;a尾部追加、不清空原内容;r+读写不清空原文件,指针默认在文件开头。
题目3:os和shutil模块的区别?
答案:os负责基础文件、目录创建删除、路径判断;shutil负责高级批量操作,支持文件夹递归复制、非空文件夹删除、文件移动,弥补os模块的功能短板。
题目4:json.dump中文乱码如何解决?
答案:设置参数 ensure_ascii=False,禁止中文转义Unicode编码,同时指定utf-8编码格式即可正常显示中文。
题目5:CSV写入出现空行、中文乱码怎么处理?
答案:打开文件时添加 newline="" 解决空行问题;编码使用 utf-8-sig 适配Windows Excel,解决中文乱码。
八、全文终极背诵总结
1、文件读写:open实现基础读写,r读、w清空写、a追加写,二进制文件加b模式,文本文件必须指定编码。
2、with管理器:工程唯一标准写法,自动释放资源,杜绝句柄泄露,基于双魔法方法实现上下文管理。
3、系统操作:os处理基础路径和空目录,shutil实现批量复制、递归删除、文件移动等高级操作。
4、JSON解析:dump/load操作文件,dumps/loads操作字符串,支持字典与JSON互转,需适配中文编码。
5、CSV解析:轻量表格读写,DictReader支持按表头取值,配置newline和编码解决空行、乱码问题。
6、工程规范:所有文件操作优先with、路径统一拼接、编码统一UTF-8、批量文件操作使用shutil,规避所有高频坑点。