第七单元 7.1 项目1 批量重命名活动照片(课件)-《Python程序设计基础》(高等教育出版社)同步精品课堂

2026-05-08
| 55页
| 79人阅读
| 1人下载
精品

内容正文:

第七单元 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中处理文件的一种非常实用的方式,它能够在代码块执行完毕后自动关闭文件,避免了文件泄露的风险。 课堂小结 七 谢谢 $

资源预览图

第七单元 7.1 项目1 批量重命名活动照片(课件)-《Python程序设计基础》(高等教育出版社)同步精品课堂
1
第七单元 7.1 项目1 批量重命名活动照片(课件)-《Python程序设计基础》(高等教育出版社)同步精品课堂
2
第七单元 7.1 项目1 批量重命名活动照片(课件)-《Python程序设计基础》(高等教育出版社)同步精品课堂
3
第七单元 7.1 项目1 批量重命名活动照片(课件)-《Python程序设计基础》(高等教育出版社)同步精品课堂
4
第七单元 7.1 项目1 批量重命名活动照片(课件)-《Python程序设计基础》(高等教育出版社)同步精品课堂
5
第七单元 7.1 项目1 批量重命名活动照片(课件)-《Python程序设计基础》(高等教育出版社)同步精品课堂
6
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。