内容正文:
第七单元 7.1 项目1 批量重命名活动照片
Python程序设计基础
同步精品课堂
高等教育出版社
任务一
读取并解析报名表
任务二
遍历照片文件夹
任务三
照片文件名匹配与重命名
掌握国家标准《机械制图》中有关图幅、比例、字体图线等基本规定。
教学目标
一
1、掌握CSV模块的使用
2、掌握os模块的使用
3、能够对文件夹进行遍历操作
教学重难点
二
教学重点:
1、CSV模块的使用
2、os模块的使用
教学难点:
os模块的使用
导入新课
三
同学们,学校在元宵节前夕举办了一系列传统文化活动,包括灯笼制作、猜灯谜等。同学们踊跃报名,提交了报名表和照片。但是现在遇到了一个麻烦:收集上来的照片都是以“学号.jpg”命名的,比如 11006220501.jpg。当老师想要查看“张三”同学的照片时,根本不知道哪个文件是他,必须一个个点开查看,非常浪费时间!
重命名前:
重命名后:
今天我们就要用 Python 编写一个自动化程序,批量重命名这些照片文件。手工一个一个改,100张照片可能要花半小时;而用程序,只需要 0.1 秒!
任务一
读取并解析报名表
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
1、CSV文件的概念
CSV(Comma-Separated Values,逗号分隔值)是一种纯文本格式,用于存储表格数据。
假设我们有一个学生表格:
姓名 年龄 班级
张三 16 高一1班
李四 17 高一2班
用 CSV 格式表示就是:
姓名,年龄,班级
张三,16,高一1班
李四,17,高一2班
第一行通常是表头
每一行代表一条记录
单元格之间用逗号分隔
可以用记事本打开查看,也可以用 Excel 打开
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
2、CSV文件与 Excel 的对比
特性 CSV 文件 Excel 文件
格式 纯文本 二进制
打开方式 记事本、Excel 均可 需要 Excel 软件
程序处理 非常简单 需要额外库
文件大小 小 大
跨平台性 好 一般
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、CSV模块
Python中的CSV模块是一个非常实用的库,它允许程序员轻松地读取和写入CSV文件。
CSV模块的导入语句:import csv
csv.reader(文件对象)
作用:创建 CSV 读取器
返回值:reader 对象
csv.writer(文件对象)
作用:创建 CSV 写入器
返回值:writer 对象
核心函数
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
4、文件操作
同学们,我们一起来回忆一下打开文件的完整语法:
with open(文件路径, 模式, encoding='编码') as 变量名:
# 文件操作代码
'r'
只读(默认)
'r+'
读写
'w'
写入(会覆盖原有内容)
'a'
追加(在文件末尾添加)
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
4、文件操作
with open(csvFilePath, 'r', encoding='utf-8') as f:
上下文管理器,确保文件操作后自动关闭
打开文件函数
文件路径变量
读取模式
指定编码,处理中文
将文件对象赋值给变量 f
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
5、分析 CSV 文件结构
为什么需要筛选列?
减少内存占用
提高代码可读性
避免处理无关数据时出错
索引 列名 是否使用 说明
0 序号 自动编号,无实际用途
1 姓名 用于新文件名
2 性别 与重命名无关
3 年龄 与重命名无关
4 学号 作为匹配的“桥梁”
5 班级 用于新文件名
6 年级 班级已包含年级信息
不使用
使用
不使用
不使用
使用
使用
不使用
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
6、项目实施一
import csv
csvFilePath = 'studentInfo.csv'
studentInfo = {}
with open(csvFilePath, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
next(reader)
for row in reader:
admissiomTicketNumber = row[0]
className = row[1]
studentName = row[2]
studentInfo[admissiomTicketNumber ] = (className, stuName)
print(“学号提取完成”)
print(studentInfo)
定义文件路径,使用变量便于后期修改
with open 语句可以自动关闭文件,不需要手动调用 f.close()
reader 是一个可迭代对象,每次循环可以获取一行数据
根据列索引提取所需字段,Python 中索引从 0 开始
键使用学号,值使用元组(班级, 姓名)
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
7、项目实施一的常见错误及解决办法
FileNotFoundError:CSV 文件不存在或路径错误
UnicodeDecodeError:编码问题
IndexError: list index out of range:列索引超出范围
读取到乱码:编码不匹配
检查文件名和路径是否正确
尝试 encoding='gbk'
检查 CSV 文件列数,打印 len(row) 查看
确认文件保存时的编码格式
任务二
遍历照片文件夹
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
1、os 模块概述
os 是 Operating System(操作系统)的缩写,os模块是 Python 标准库中的一个模块,提供与操作系统交互的功能,不需要额外安装,直接 import os 即可使用。
获取当前工作目录
列出文件夹中的文件
创建、删除、重命名文件和文件夹
拼接文件路径
获取文件大小、修改时间等信息
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
2、相对路径与绝对路径
相对路径:相对于当前工作目录的路径
例:imagefiles 或 ./imagefiles
绝对路径:从根目录开始的完整路径
例:C:\Users\admin\Desktop\imagefiles
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.getcwd()
基本用法:
import os
current_path = os.getcwd()
print(current_path) # 输出:D:\python_project
注意事项:
返回当前工作目录的绝对路径字符串
不包含末尾的路径分隔符
程序运行时目录可能改变,建议多次调用获取最新路径
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.chdir(指定路径)
基本用法:
os.chdir('D:/photos') # 切换到 D 盘 photos 目录
os.chdir('..') # 切换到上一级目录
os.chdir('/home/user') # Linux 绝对路径
注意事项:
路径不存在会抛出 FileNotFoundError
无权限访问会抛出 PermissionError
切换后影响后续所有相对路径操作
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.listdir(路径参数)
基本用法:
files = os.listdir('.') # 列出当前目录
images = os.listdir('imagefiles') # 列出指定目录
注意事项:
返回列表,包含文件名和目录名
不包括 . 和 .. 特殊目录
不递归遍历子文件夹
列表顺序不确定,需要排序可自行调用 sorted()
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.walk(路径参数)
基本用法:
for root, dirs, files in os.walk('imagefiles'):
print(f"当前目录:{root}")
print(f"子文件夹:{dirs}")
print(f"文件列表:{files}")
注意事项:
返回三元组:(目录路径, 子目录列表, 文件列表)
默认 topdown=True,从上往下遍历
遍历过程中修改 dirs 列表可控制遍历行为
大目录遍历耗时较长
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.exists(路径参数)
基本用法:
if os.path.exists('studentInfo.csv'):
print("文件存在")
else:
print("文件不存在")
注意事项:
文件和目录都适用
对符号链接会判断链接目标是否存在
权限不足时也可能返回 False
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.isdir(参数)
基本用法:
if os.path.isdir('imagefiles'):
print("是文件夹")
注意事项:
参数不存在时返回 False(不抛异常)
符号链接指向目录时也返回 True
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.isfile(参数)
基本用法:
if os.path.isfile('photo.jpg'):
print("是文件")
注意事项:
参数不存在时返回 False
目录返回 False
符号链接指向文件时返回 True
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.join(路径1, 路径2)
基本用法:
full_path = os.path.join('imagefiles', '11001.jpg')
# Windows: imagefiles\11001.jpg
# Linux: imagefiles/11001.jpg
注意事项:
自动适配操作系统路径分隔符
后续路径以 / 开头时会重置前面的路径
推荐始终使用此函数,不手动拼接
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.split(路径)
基本用法:
path = 'D:/photos/11001.jpg'
dir_part, file_part = os.path.split(path)
# dir_part = 'D:/photos', file_part = '11001.jpg'
注意事项:
返回元组 (目录部分, 文件名部分)
路径以分隔符结尾时,文件名为空
不判断路径是否真实存在
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.dirname(路径)
基本用法:
dir_name = os.path.dirname('D:/photos/11001.jpg')
print(dir_name) # 输出:D:/photos
注意事项:
只返回目录部分,等价于 os.path.split()[0]
多层嵌套时逐级向上获取
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.basename(路径)
基本用法:
base_name = os.path.basename('D:/photos/11001.jpg')
print(base_name) # 输出:11001.jpg
注意事项:
只返回文件名部分,等价于 os.path.split()[1]
路径以分隔符结尾时返回空字符串
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.sep
基本用法:
print(os.path.sep) # Windows: \ , Linux: /
path = f"imagefiles{os.path.sep}photo.jpg"
注意事项:
只读属性,不能修改
主要用于跨平台路径字符串构造
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.mkdir(路径)
基本用法:
os.mkdir('new_folder') # 创建单层目录
os.mkdir('D:/photos/backup') # 绝对路径创建
注意事项:
只能创建单层目录,父目录必须存在
目录已存在时抛出 FileExistsError
无权限时抛出 PermissionError
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.makedirs(路径)
基本用法:
os.makedirs('level1/level2/level3') # 递归创建多层目录
os.makedirs('folder', exist_ok=True) # 存在时不报错
注意事项:
自动创建所有不存在的中间目录
添加 exist_ok=True 参数可避免目录已存在时报错
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.rmdir(路径)
基本用法:
os.rmdir('empty_folder') # 只能删除空文件夹
注意事项:
只能删除空目录,非空时报错
删除不存在的目录报 FileNotFoundError
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.rename(oldname, newname)
基本用法:
os.rename('old.jpg', 'new.jpg') # 重命名
os.rename('photos/1.jpg', 'backup/1.jpg') # 移动文件
注意事项:
可重命名文件或目录
可移动文件到其他目录(同磁盘)
跨磁盘移动需要先复制再删除
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.path.getsize(文件参数)
基本用法:
size_bytes = os.path.getsize('photo.jpg')
size_kb = size_bytes / 1024
print(f"文件大小:{size_kb:.2f} KB")
注意事项:
返回字节数为整数
文件不存在抛出 FileNotFoundError
对目录使用可能结果不准确
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.write(文件名, 写入内容)
基本用法:
fd = os.open('test.txt', os.O_WRONLY | os.O_CREAT)
os.write(fd, b'Hello World')
os.close(fd)
注意事项:
需要先打开文件获得文件描述符
写入内容必须是 bytes 类型
推荐使用内置 open() 函数,更简单安全
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.read(fd, n)
基本用法:
fd = os.open('test.txt', os.O_RDONLY)
content = os.read(fd, 100) # 最多读取100字节
os.close(fd)
注意事项:
n 表示最多读取的字节数
返回 bytes 类型,需要 decode() 转为字符串
推荐使用内置 open() 函数
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、os 模块常用函数详解——os.close(fd)
基本用法:
os.close(fd) # 关闭文件描述符
注意事项:
文件操作完成后必须关闭
关闭已关闭的文件描述符会报错
使用 with open() 可自动管理关闭
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
4、项目实施二
import os
imageFolderPath = 'imagefiles'
imageFiles = os.listdir(imageFolderPath
fileNameList = []
for fileName in imageFiles :
stuCode, extension = os.path.splitext(fileName)
if extension.lower() in (‘.jpg’,’jpeg’,’gif’,’bmp’,’png’)
fileNameList.append((stuCode, extension))
注意:这个文件夹应该和 Python 程序在同一目录下
使用 os.listdir() 获取文件夹中所有内容的名称
创建空列表,用于存储图片文件信息
使用 os.path.splitext() 分离文件名和扩展名
判断是否为图片文件
是图片文件,将信息添加到列表
任务三
照片文件名匹配与重命名
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
1、字典的键查找
①直接使用 in 运算符:
if stuCode in studentInfo:
info = studentInfo[stuCode]
②使用 get() 方法:
info = studentInfo.get(stuCode)
if info is not None:
pass
in 运算符的原理
字典内部使用哈希表实现
查找速度非常快,O(1) 时间复杂度
无论字典有多大,查找时间几乎恒定
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
2、字符串格式化方法
方法 语法 示例 适用场景
% 格式化 "%s_%s" % (a, b) "%s_%s" % ("高一1班", "张三") 老式方法
format() "{} {}".format(a, b) "{}_{}".format(className, studentName) Python 2.6+
f-string f"{a} {b}" f"{className}_{studentName}" Python 3.6+(推荐)
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、项目实施三
import os
import csv
csvFilePath = 'studentInfo.csv'
studentInfo = {} # {学号: (班级, 姓名)}
try:
with open(csvFilePath, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader) # 跳过表头
for row in reader:
stuName = row[1] # 姓名
stuCode = row[4] # 学号
className = row[5] # 班级
studentInfo[stuCode] = (className, stuName)
except FileNotFoundError:
print(f"✗ 错误:找不到文件 {csvFilePath}")
exit()
except Exception as e:
print(f"✗ 读取文件时出错:{e}")
exit()
# ========== 第二部分:遍历照片文件夹(同任务2)==========
imageFolderPath = 'imagefiles'
fileNameList = [] # [(学号, 扩展名), ...]
validExtensions = ('.jpg', '.jpeg', '.png', '.bmp', '.gif')
if not os.path.exists(imageFolderPath):
print(f"✗ 错误:文件夹 '{imageFolderPath}' 不存在")
exit()
机位固定:摄像机本身不移动(如不推、拉、摇、移)。
新知讲授
四
3、项目实施三
allFiles = os.listdir(imageFolderPath)
for fileName in allFiles:
stuCode, extension = os.path.splitext(fileName)
if extension.lower() in validExtensions:
fileNameList.append((stuCode, extension))
print(f"✓ 找到 {len(fileNameList)} 张图片文件")
success_count = 0 # 成功重命名的数量
fail_not_found = 0 # 学号在报名表中不存在的数量
fail_already_exists = 0 # 目标文件名已存在的数量
fail_other = 0 # 其他错误的数量
for stuCode, extension in fileNameList:
if stuCode not in studentInfo:
print(f" 跳过:学号 {stuCode} 在报名表中不存在")
fail_not_found += 1
continue
# 获取学生信息
className, studentName = studentInfo[stuCode]
safe_className = className.replace('/', '_').replace('\\', '_')
safe_studentName = studentName.replace('/', '_').replace('\\', '_')
newName = f"{safe_className}_{safe_studentName}{extension}"
oldPath = os.path.join(imageFolderPath, stuCode + extension)
newPath = os.path.join(imageFolderPath, newName)
if os.path.exists(newPath):
print(f" 跳过:目标文件已存在 {newName}")
fail_already_exists += 1
continue
print("
" + "="*60)
print("重命名任务完成!统计报告")
print(f"总图片数量:{len(fileNameList)}")
print(f"✓ 成功重命名:{success_count}")
师生互动
五
1、遍历文件夹时,如何区分图片文件和其他文件
2、为什么照片文件名匹配时要使用字典存储学生信息
3、重命名前为什么要检查目标文件名是否已存在
答案:
1、用os.path.splitext()获取扩展名并判断。
2、字典通过学号键可快速查找对应班级姓名。
3、防止同名文件被覆盖,避免数据丢失。
随堂练习
六
1 、在项目实践中,存储学生信息的数据结构是( )。
A. 列表
B. 元组
C. 字典
D. 集合
答案:C
解析:学生信息以学号为键,班级和姓名的元组为值存储在字典中。
随堂练习
六
2 、下列( )方法用于将文件的扩展名统一转换为小写
A. lower()
B. upper()
C. capitalize()
D. strip()
答案:A
解析:lower()方法将字符串中的所有字母转换为小写,用于扩展名比较。
随堂练习
六
3 、在os模块中,用于重命名文件的方法是( )。
A. os.renames()
B. os.rename()
C. os.name()
D. os.ren()
答案:B
解析:os.rename(old, new)用于重命名文件或目录。
随堂练习
六
4 、下列( )函数用于判断一个路径是否为文件
A. os.path.isdir()
B. os.path.isfile()
C. os.path.exists()
D. os.path.getsize()
答案:B
解析:os.path.isfile(path)判断路径是否为文件。
随堂练习
六
5 、(多项选择题)下列( )是Python中处理CSV文件常用的方法。
A. csv.reader()
B. csv.writer()
C. os.listdir()
D. csv.DictReader()
答案:ABD
解析:csv模块提供reader、writer、DictReader等方法,os.listdir()不是CSV处理方法。
随堂练习
六
6 、(多项选择题)os模块的功能有( )。
A. 文件重命名
B. 目录遍历
C. 图像滤镜
D. 路径拼接
答案:ABD
解析:os模块支持文件重命名、目录遍历、路径拼接,图像滤镜需要其他库。
随堂练习
六
7、(是非选择题)os.rename()函数可以跨磁盘分区重命名文件。
A.正确
B.错误
答案:B
解析:os.rename()通常不能跨文件系统或分区,跨分区需使用shutil.move()。
随堂练习
六
8、(是非选择题)format()方法是Python中字符串格式化的唯一方式。
A.正确
B.错误
答案:B
解析:还有f-string和%格式化等多种方式。
随堂练习
六
9、 语句是Python中处理 的一种非常实用的方式,它能够在代码块执行完毕后 ,避免了 的风险。
答案:with 文件 自动关闭文件 文件泄露
解析:with语句是Python中处理文件的一种非常实用的方式,它能够在代码块执行完毕后自动关闭文件,避免了文件泄露的风险。
课堂小结
七
谢谢
$