Python文件与I/O深度解析(open读写/上下文管理器with/os/shutil/JSON-CSV解析·面试真题)

文件 I/O 是 Python 脚本和后端工具的基础能力,open、with、os、shutil、JSON 和 CSV 共同覆盖常见文件处理场景。

文件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,规避所有高频坑点。

后浪云移动端信息流广告 后浪云主机服务 适合长期部署、独立站和海外机房需求。