如何使用pathlib匹配学生文件夹与对应成绩Excel文件并完成复制操作
解决用Pathlib匹配学生文件夹并复制对应成绩Excel的问题
我来帮你搞定这个文件匹配和复制的问题!你的思路方向是对的,但代码里有几个需要调整的地方,我会一步步给你修正并补上复制功能的实现。
先说说你现有代码的几个问题:
- 匹配逻辑错误:用
zip同时遍历两个目录的内容会出问题——如果Directory 1的学生子文件夹数量和Directory 2找到的Excel文件数量不一致,zip会直接截断到较短的那个列表,导致完全错误的文件匹配。 - 语法错误:
str.lower(subfolder.name) is in str.lower(file.name)里的is in是错误写法,应该改成in;另外直接调用字符串的.lower()方法会更简洁规范,比如subfolder.name.lower()。 - 缺少文件复制实现:你需要用
shutil模块的复制函数(或者Python 3.12+的Path内置方法)来完成文件复制操作。
修正后的完整代码
import pathlib as pl import shutil # 定义两个目录路径 dir1 = pl.WindowsPath(r'C:\Users\username\directory_1') dir2 = pl.WindowsPath(r'C:\Users\username\directory_2') # 遍历Directory 1中的每个学生子文件夹 for student_folder in dir1.iterdir(): # 确保当前项是文件夹(避免误处理文件) if student_folder.is_dir(): # 提取学生标识(转小写,避免大小写匹配问题) student_identifier = student_folder.name.lower() # 在Directory 2中递归搜索所有Excel文件 for grade_file in dir2.rglob("*.xlsx"): # 判断当前Excel文件名是否包含学生标识 if student_identifier in grade_file.name.lower(): # 复制Excel文件到对应的学生文件夹 shutil.copy2(grade_file, student_folder) print(f'✅ {grade_file.name} 已成功复制到 {student_folder.name}') # 如果每个学生只有一份成绩表,可以在这里加break跳出循环,避免重复匹配 break else: # 如果没有找到对应文件,提示用户 print(f'⚠️ 未找到与 {student_folder.name} 匹配的成绩表')
代码解释:
- 模块导入:新增
shutil模块,它是Python标准库中专门处理文件复制、移动等操作的工具。 - 遍历学生文件夹:用
dir1.iterdir()遍历Directory 1的内容,同时用is_dir()过滤出子文件夹(避免处理可能存在的文件)。 - 大小写不敏感匹配:把学生文件夹名和Excel文件名都转成小写,避免因为大小写差异导致匹配失败(比如
Smith, John和smith, john)。 - 文件复制:用
shutil.copy2()复制文件,它会保留文件的元数据(比如创建时间、修改时间),比简单的shutil.copy()更合适。 - 优化匹配效率:如果每个学生只有一份对应的成绩表,找到匹配文件后用
break跳出循环,不用继续搜索其他文件。
内容的提问来源于stack exchange,提问作者KevOMalley743
相关产品推荐
相关产品推荐

