第6章 文件与文件夹操作
本章目标
学习完成后,你应该能够:
- 理解文件与二进制文件、文本文件的区别
- 掌握
open()函数的基本使用方法 - 熟悉常见文件读写模式:
r、w、a、rb、wb - 掌握文件对象的常用属性和方法
- 理解
with open(...)的作用 - 学会使用
os和os.path进行文件夹与路径操作 - 能写出简单的文件管理小程序
1. 文件介绍
文件是操作系统中管理用户数据的基本单元。
常见文件类型包括:
- 文本文件:
.txt - 文档文件:
.docx - 表格文件:
.xlsx - 图片文件:
.jpg、.png - 音频文件:
.wav、.mp3 - 视频文件:
.mp4、.avi
从底层看,所有文件本质上都可以看作二进制数据。
文本文件
文本文件以字符形式保存内容,通常是人类可读的。
二进制文件
二进制文件不能直接用普通文本编辑器正确阅读,需要特定程序去解析。
Hello
Python 文件操作
第三行内容
2. open() 函数
Python 使用 open() 打开文件。
基本语法:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
最常用参数:
file:文件路径mode:打开模式encoding:编码格式,读写文本文件时常用utf-8
常见模式总结
| 模式 | 含义 |
|---|---|
r |
只读,文件必须存在 |
w |
写入,文件存在会覆盖,不存在会新建 |
a |
追加,在文件末尾继续写 |
r+ |
读写,指针在开头 |
w+ |
读写,覆盖原内容或新建 |
a+ |
读写,写入位置默认在末尾 |
rb |
以二进制方式只读 |
wb |
以二进制方式写入 |
ab |
以二进制方式追加 |
3. 创建演示环境
为了避免影响你电脑中的真实文件,我们先创建一个专门的演示文件夹。
from pathlib import Path
demo_dir = Path("chapter6_demo")
demo_dir.mkdir(exist_ok=True)
print("演示目录:", demo_dir.resolve())
演示目录: C:\Users\93992\Desktop\python课程设计\代码展示jupyter notebook\chapter6_demo
4. 写入文本文件:w
w 模式特点:
- 文件存在:覆盖原内容
- 文件不存在:自动创建
file1 = demo_dir / "example1.txt"
print(file1)
with open(file1, "w", encoding="utf-8") as f:
f.write("第一行:Python 文件操作\n")
f.write("第二行:这是写入的内容\n")
print("写入完成")
print(file1.read_text(encoding="utf-8"))
chapter6_demo\example1.txt
写入完成
第一行:Python 文件操作
第二行:这是写入的内容
5. 读取文本文件:r
读取常见方法:
read():读取全部内容read(n):读取前n个字符readline():读取一行readlines():读取所有行并返回列表
read() 结果:
第一行:Python 文件操作
第二行:这是写入的内容
read(6) 结果:
第一行:Py
with open(file1, "r", encoding="utf-8") as f:
content_line1 = f.readline()
print(len(content_line1))
print(len(content_line1.strip()))
print(content_line1)
print(content_line1.strip())
print("第一行:", content_line1.strip())
print("第二行:", f.readline().strip())
16
15
第一行:Python 文件操作
第一行:Python 文件操作
第一行: 第一行:Python 文件操作
第二行: 第二行:这是写入的内容
['第一行:Python 文件操作\n', '第二行:这是写入的内容\n']
6. 追加写入:a
a 模式不会覆盖原有内容,而是在文件末尾继续写。
with open(file1, "a", encoding="utf-8") as f:
f.write("第三行:这是追加的内容\n")
print(file1.read_text(encoding="utf-8"))
第一行:Python 文件操作
第二行:这是写入的内容
第三行:这是追加的内容
第三行:这是追加的内容
第四行:这是追加的内容第五行:结尾
7. 文件对象的常用属性
PPT 中提到的常用属性有:
closedmodename
f = open(file1, "r", encoding="utf-8")
print("是否关闭:", f.closed)
print("打开模式:", f.mode)
print("文件名:", f.name)
f.close()
print("关闭后:", f.closed)
是否关闭: False
打开模式: r
文件名: chapter6_demo\example1.txt
关闭后: True
8. 文件对象的常用方法
常见方法包括:
close()read()readline()readlines()write()writelines()tell()seek()
with open(file1, "r", encoding="utf-8") as f:
print("当前位置:", f.tell())
print("读取5个字符:", f.read(5))
print("读取5个字符:", f.read(5))
print("读取后位置:", f.tell())
f.seek(0)
print("seek(0) 后位置:", f.tell())
print("重新读取前4个字符:", f.read(4))
当前位置: 0
读取5个字符: 第一行:P
读取5个字符: ython
读取后位置: 18
seek(0) 后位置: 0
重新读取前4个字符: 第一行:
writelines() 示例
注意:writelines() 不会自动帮你补换行符。
file2 = demo_dir / "example2.txt"
lines = ["苹果\n", "香蕉\n", "橘子\n"]
with open(file2, "w", encoding="utf-8") as f:
f.writelines(lines)
print(file2.read_text(encoding="utf-8"))
苹果
香蕉
橘子
9. 为什么推荐使用 with open(...)
with 语句可以自动管理资源。即使程序中途出错,也能较好地保证文件被关闭。
推荐写法:
with open(file2, "r", encoding="utf-8") as f:
print("with 代码块中 closed:", f.closed)
print("with 代码块外 closed:", f.closed)
with 代码块中 closed: False
with 代码块外 closed: True
10. 二进制文件示例
二进制模式通常用于图片、音频、压缩包等文件,也可以直接处理字节数据。
binary_file = demo_dir / "data.bin"
with open(binary_file, "wb") as f:
f.write(bytes([65, 66, 67, 68, 69])) # 对应 ASCII: A B C D E
with open(binary_file, "rb") as f:
data = f.read()
print("读取到的字节数据:", data)
读取到的字节数据: b'ABCDE'
第二部分:文件夹操作
本部分对应 PPT 中的:
os模块os.path模块
11. os 模块简介
os 模块可用于和操作系统交互,例如:
- 获取当前工作目录
- 列出目录内容
- 创建/删除文件夹
- 重命名文件或文件夹
- 遍历目录树
当前工作目录: C:\Users\93992\Desktop\python课程设计\代码展示jupyter notebook
当前目录下的内容(部分):
['.ipynb_checkpoints', 'chapter6_demo', 'mymath_demo.py', 'name_demo.py', '__pycache__', '思维测试.ipynb', '第2章_Python数据类型_课堂演示.ipynb', '第2章_学生练习课.ipynb', '第2章_融合思考练习课.ipynb', '第3章_开始程序设计_课堂演示.ipynb']
12. os.chdir() 与 os.getcwd()
os.getcwd():获取当前工作目录os.chdir(path):切换当前工作目录
课堂演示时可运行;平时写项目代码时,频繁切换工作目录要谨慎。
current = os.getcwd()
print("切换前:", current)
os.chdir(demo_dir)
print("切换后:", os.getcwd())
# 再切回原目录
os.chdir(current)
print("恢复后:", os.getcwd())
切换前: C:\Users\93992\Desktop\python课程设计\代码展示jupyter notebook
切换后: C:\Users\93992\Desktop\python课程设计\代码展示jupyter notebook\chapter6_demo
恢复后: C:\Users\93992\Desktop\python课程设计\代码展示jupyter notebook
13. 创建与删除文件夹
常见函数:
os.mkdir(path):创建文件夹os.rmdir(path):删除空文件夹
folder_a = demo_dir / "folder_a"
if not folder_a.exists():
os.mkdir(folder_a)
print("已创建:", folder_a)
else:
print("文件夹已存在:", folder_a)
print("当前演示目录内容:", os.listdir(demo_dir))
已创建: chapter6_demo\folder_a
当前演示目录内容: ['.ipynb_checkpoints', 'data.bin', 'example1.txt', 'example2.txt', 'folder_a']
# 删除空文件夹示例
if folder_a.exists() and folder_a.is_dir():
os.rmdir(folder_a)
print("已删除空文件夹:", folder_a)
print("当前演示目录内容:", os.listdir(demo_dir))
已删除空文件夹: chapter6_demo\folder_a
当前演示目录内容: ['.ipynb_checkpoints', 'data.bin', 'example1.txt', 'example2.txt']
14. 重命名文件或文件夹:os.rename()
old_name = demo_dir / "old_name.txt"
new_name = demo_dir / "new_name.txt"
with open(old_name, "w", encoding="utf-8") as f:
f.write("这是一个用于重命名测试的文件")
os.rename(old_name, new_name)
print("重命名后是否存在新文件:", new_name.exists())
重命名后是否存在新文件: True
15. 删除文件:os.remove()
temp_file = demo_dir / "temp_delete.txt"
temp_file.write_text("待删除文件", encoding="utf-8")
print("删除前存在吗:", temp_file.exists())
os.remove(temp_file)
print("删除后存在吗:", temp_file.exists())
删除前存在吗: True
删除后存在吗: False
16. 递归遍历目录:os.walk()
os.walk(path) 会逐层遍历目录,返回:
- 当前路径
- 当前路径下的子目录列表
- 当前路径下的文件列表
# 准备一个简单的目录结构
(demo_dir / "sub1").mkdir(exist_ok=True)
(demo_dir / "sub2").mkdir(exist_ok=True)
(demo_dir / "sub1" / "a.txt").write_text("A", encoding="utf-8")
(demo_dir / "sub2" / "b.txt").write_text("B", encoding="utf-8")
for root, dirs, files in os.walk(demo_dir):
print("当前目录:", root)
print("子目录:", dirs)
print("文件:", files)
print("-" * 40)
当前目录: chapter6_demo
子目录: ['.ipynb_checkpoints', 'sub1', 'sub2']
文件: ['data.bin', 'example1.txt', 'example2.txt', 'new_name.txt']
----------------------------------------
当前目录: chapter6_demo\.ipynb_checkpoints
子目录: []
文件: ['example1-checkpoint.txt']
----------------------------------------
当前目录: chapter6_demo\sub1
子目录: []
文件: ['a.txt']
----------------------------------------
当前目录: chapter6_demo\sub2
子目录: []
文件: ['b.txt']
----------------------------------------
17. os 模块中的常用属性
PPT 中列出的三个常用属性:
os.sep:路径分隔符os.linesep:行结束符os.name:操作系统名称
路径分隔符: '\\'
行结束符: '\r\n'
操作系统名称: nt
第三部分:os.path 模块
os.path 专门用于路径处理。
18. 路径基本处理
常用函数:
abspath(path)basename(path)dirname(path)exists(path)isdir(path)isfile(path)join(path, *paths)
sample_path = os.path.join("chapter6_demo", "sub1", "a.txt")
print("拼接后的路径:", sample_path)
print("绝对路径:", os.path.abspath(sample_path))
print("文件名:", os.path.basename(sample_path))
print("目录名:", os.path.dirname(sample_path))
print("是否存在:", os.path.exists(sample_path))
print("是否是文件:", os.path.isfile(sample_path))
print("是否是目录:", os.path.isdir(sample_path))
拼接后的路径: chapter6_demo\sub1\a.txt
绝对路径: C:\Users\93992\Desktop\python课程设计\代码展示jupyter notebook\chapter6_demo\sub1\a.txt
文件名: a.txt
目录名: chapter6_demo\sub1
是否存在: True
是否是文件: True
是否是目录: False
19. 路径拆分
常用函数:
split(path):拆成“目录 + 最后一个部分”splitext(path):拆成“主文件名 + 扩展名”splitdrive(path):拆出盘符(Windows 中更明显)
p = os.path.join("chapter6_demo", "sub1", "a.txt")
print("split:", os.path.split(p))
print("splitext:", os.path.splitext(p))
print("splitdrive:", os.path.splitdrive(p))
split: ('chapter6_demo\\sub1', 'a.txt')
splitext: ('chapter6_demo\\sub1\\a', '.txt')
splitdrive: ('', 'chapter6_demo\\sub1\\a.txt')
20. 获取文件信息
常用函数:
getsize():文件大小getatime():最后访问时间getmtime():最后修改时间getctime():创建时间(不同系统含义可能略有区别)
import time
target = demo_dir / "sub1" / "a.txt"
print("文件大小:", os.path.getsize(target), "字节")
print("最后访问时间:", time.ctime(os.path.getatime(target)))
print("最后修改时间:", time.ctime(os.path.getmtime(target)))
print("创建时间:", time.ctime(os.path.getctime(target)))
文件大小: 1 字节
最后访问时间: Mon Mar 23 03:27:32 2026
最后修改时间: Mon Mar 23 03:27:32 2026
创建时间: Mon Mar 23 03:27:32 2026
21. 综合案例:统计某个文件夹中的 .txt 文件数量
这是一个很适合课堂讲解的综合例子。
txt_count = 0
txt_files = []
for root, dirs, files in os.walk(demo_dir):
for file in files:
if file.endswith(".txt"):
txt_count += 1
txt_files.append(os.path.join(root, file))
print("txt 文件总数:", txt_count)
print("文件列表:")
for item in txt_files:
print("-", item)
txt 文件总数: 6
文件列表:
- chapter6_demo\example1.txt
- chapter6_demo\example2.txt
- chapter6_demo\new_name.txt
- chapter6_demo\.ipynb_checkpoints\example1-checkpoint.txt
- chapter6_demo\sub1\a.txt
- chapter6_demo\sub2\b.txt
22. 综合案例:把一个文本文件复制到新文件
这里不使用高级库,只用本章知识完成。
source = demo_dir / "example1.txt"
target = demo_dir / "example1_copy.txt"
with open(source, "r", encoding="utf-8") as f1:
content = f1.read()
with open(target, "w", encoding="utf-8") as f2:
f2.write(content)
print("复制完成,目标文件内容如下:")
print(target.read_text(encoding="utf-8"))
复制完成,目标文件内容如下:
第一行:Python 文件操作
第二行:这是写入的内容
第三行:这是追加的内容
23. 常见错误提醒
1)文件不存在
使用 r 模式时,文件必须已经存在,否则会报错。
2)编码问题
读写中文文本时,建议明确写上:
3)路径写法问题
跨平台时建议使用:
而不是手动拼接斜杠。
4)忘记关闭文件
优先使用 with open(...)。
24. 课堂练习
练习1
创建一个名为 student.txt 的文件,写入三行学生信息。
练习2
读取 student.txt 的全部内容,并逐行打印。
练习3
在演示目录下新建一个文件夹 homework。
练习4
统计 chapter6_demo 目录下所有 .txt 文件的总数。
练习5
把 student.txt 复制成 student_backup.txt。
25. 课后思考
w和a的区别是什么?- 为什么推荐使用
with open(...)? read()、readline()、readlines()有什么不同?os.listdir()和os.walk()的区别是什么?- 为什么写路径时更推荐
os.path.join()?
26. 本章小结
本章主要学习了两个部分:
文件操作
- 文件的基本概念
open()的使用- 文本文件与二进制文件
- 文件对象的属性和方法
with上下文管理
文件夹与路径操作
os模块常用函数os.path模块常用函数- 目录遍历
- 文件信息获取
- 简单综合案例