跳转至

第6章 文件与文件夹操作

本章目标

学习完成后,你应该能够:

  • 理解文件与二进制文件、文本文件的区别
  • 掌握 open() 函数的基本使用方法
  • 熟悉常见文件读写模式:rwarbwb
  • 掌握文件对象的常用属性和方法
  • 理解 with open(...) 的作用
  • 学会使用 osos.path 进行文件夹与路径操作
  • 能写出简单的文件管理小程序

1. 文件介绍

文件是操作系统中管理用户数据的基本单元。

常见文件类型包括:

  • 文本文件:.txt
  • 文档文件:.docx
  • 表格文件:.xlsx
  • 图片文件:.jpg.png
  • 音频文件:.wav.mp3
  • 视频文件:.mp4.avi

从底层看,所有文件本质上都可以看作二进制数据

文本文件

文本文件以字符形式保存内容,通常是人类可读的。

二进制文件

二进制文件不能直接用普通文本编辑器正确阅读,需要特定程序去解析。

# 一个简单的文本文件示例
text = "Hello\nPython 文件操作\n第三行内容"
print(text)
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():读取所有行并返回列表
with open(file1, "r", encoding="utf-8") as f:
    content = f.read()

print("read() 结果:")
print(content)
read() 结果:
第一行:Python 文件操作
第二行:这是写入的内容
with open(file1, "r", encoding="utf-8") as f:
    print("read(6) 结果:")
    print(f.read(6))
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 文件操作
第二行: 第二行:这是写入的内容
with open(file1, "r", encoding="utf-8") as f:
    lines = f.readlines()

print(lines)
['第一行: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 中提到的常用属性有:

  • closed
  • mode
  • name
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(filename, mode, encoding="utf-8") as f:
    # 读写操作
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 模块可用于和操作系统交互,例如:

  • 获取当前工作目录
  • 列出目录内容
  • 创建/删除文件夹
  • 重命名文件或文件夹
  • 遍历目录树
import os

print("当前工作目录:", os.getcwd())
print("当前目录下的内容(部分):")
print(os.listdir("." )[:10])
当前工作目录: 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:操作系统名称
print("路径分隔符:", repr(os.sep))
print("行结束符:", repr(os.linesep))
print("操作系统名称:", 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)编码问题

读写中文文本时,建议明确写上:

encoding="utf-8"

3)路径写法问题

跨平台时建议使用:

os.path.join(...)

而不是手动拼接斜杠。

4)忘记关闭文件

优先使用 with open(...)

24. 课堂练习

练习1

创建一个名为 student.txt 的文件,写入三行学生信息。

练习2

读取 student.txt 的全部内容,并逐行打印。

练习3

在演示目录下新建一个文件夹 homework

练习4

统计 chapter6_demo 目录下所有 .txt 文件的总数。

练习5

student.txt 复制成 student_backup.txt

25. 课后思考

  1. wa 的区别是什么?
  2. 为什么推荐使用 with open(...)
  3. read()readline()readlines() 有什么不同?
  4. os.listdir()os.walk() 的区别是什么?
  5. 为什么写路径时更推荐 os.path.join()

26. 本章小结

本章主要学习了两个部分:

文件操作

  • 文件的基本概念
  • open() 的使用
  • 文本文件与二进制文件
  • 文件对象的属性和方法
  • with 上下文管理

文件夹与路径操作

  • os 模块常用函数
  • os.path 模块常用函数
  • 目录遍历
  • 文件信息获取
  • 简单综合案例