【入门级】如何优化这份文件重命名与清理的Python代码?
优化你的Python文件处理代码
作为编程新手能写出这样功能完整的代码已经非常棒了!接下来我们一步步拆解优化方向,解决重复代码问题、处理文件名细微差异,同时完成最后的文件移动功能。
1. 用映射关系消除重复代码
你当前代码里有大量重复的变量定义和if判断,我们可以把旧文件名与对应新文件名整理成映射列表,通过循环批量处理,彻底告别重复代码:
import os import shutil # 定义固定的文件夹路径(用绝对路径,避免切换目录带来的混乱) source_dir = 'C:\\Users\\myname\\Desktop\\C008_Start' target_dir = 'C:\\Users\\myname\\Desktop\\Python' # 旧文件名 → 新文件名的映射表 file_mappings = [ ("(1 of 4) Report View of CDRL 10 Consumption - Transaction Date.xlsx", "CDRL 10 Consumption - Monthly 1 of 4.xlsx"), ("(2 of 4) Report View of CDRL 10 Consumption - Transaction Date.xlsx", "CDRL 10 Consumption - Monthly 2 of 4.xlsx"), ("(3 of 4) Report View of CDRL 10 Consumption - Transaction Date.xlsx", "CDRL 10 Consumption - Monthly 3 of 4.xlsx"), ("(4 of 4) Report View of CDRL 10 Consumption - Transaction Date.xlsx", "CDRL 10 Consumption - Monthly 4 of 4.xlsx"), ] # 批量重命名源文件夹中的文件 for old_name, new_name in file_mappings: old_path = os.path.join(source_dir, old_name) if os.path.exists(old_path): new_path = os.path.join(source_dir, new_name) os.rename(old_path, new_path) print(f"已重命名: {old_name} → {new_name}")
2. 处理文件名的细微差异
如果文件名偶尔有小变动(比如空格、大小写,或者前缀后缀的细微调整),我们可以用正则表达式匹配文件名中的核心编号,自动生成新文件名,不用硬编码所有旧文件名:
import re # 遍历源文件夹,自动匹配符合格式的文件 for filename in os.listdir(source_dir): # 匹配带"(数字 of 4)"格式的Excel文件 match = re.search(r'\((\d+) of 4\)', filename) if match and filename.endswith('.xlsx'): # 提取编号(1-4) file_num = match.group(1) # 自动生成标准化的新文件名 new_filename = f"CDRL 10 Consumption - Monthly {file_num} of 4.xlsx" old_path = os.path.join(source_dir, filename) new_path = os.path.join(source_dir, new_filename) os.rename(old_path, new_path) print(f"已重命名: {filename} → {new_filename}")
这种方式灵活性极强,不管旧文件名的其他部分怎么变,只要包含(1 of 4)到(4 of 4)的标识,就能正确重命名。
3. 优化文件删除与移动功能
你之前的逻辑是先删除目标文件夹的旧文件,再移动新文件——其实可以直接用shutil.move一步完成,它能自动处理目标文件已存在的情况:
# 移动重命名后的文件到目标文件夹 for _, new_name in file_mappings: source_file_path = os.path.join(source_dir, new_name) target_file_path = os.path.join(target_dir, new_name) if os.path.exists(source_file_path): # 如果目标文件已存在,先删除 if os.path.exists(target_file_path): os.remove(target_file_path) print(f"已删除目标文件夹中的旧文件: {new_name}") # 执行移动 shutil.move(source_file_path, target_file_path) print(f"已移动文件到目标文件夹: {new_name}")
如果你的Python版本是3.3+,还可以用os.replace替代删除+移动的组合,更安全高效。
4. 增加错误处理,让代码更健壮
作为新手,一定要养成加错误处理的习惯,避免因为文件不存在、权限不足等问题导致程序崩溃:
# 重命名的错误处理 for old_name, new_name in file_mappings: old_path = os.path.join(source_dir, old_name) new_path = os.path.join(source_dir, new_name) try: if os.path.exists(old_path): os.rename(old_path, new_path) print(f"✅ 重命名成功: {old_name} → {new_name}") else: print(f"⚠️ 警告: 源文件不存在 - {old_name}") except Exception as e: print(f"❌ 重命名失败 {old_name}: {str(e)}") # 移动的错误处理 for _, new_name in file_mappings: source_path = os.path.join(source_dir, new_name) target_path = os.path.join(target_dir, new_name) try: if os.path.exists(source_path): if os.path.exists(target_path): os.remove(target_path) shutil.move(source_path, target_path) print(f"✅ 移动成功: {new_name} → {target_dir}") else: print(f"⚠️ 警告: 待移动文件不存在 - {new_name}") except Exception as e: print(f"❌ 移动失败 {new_name}: {str(e)}")
最终优化后的完整代码
结合以上所有优化点,最终的代码结构清晰、灵活性强、容错性高:
import os import shutil import re # 配置文件夹路径(把这里改成你的实际路径) SOURCE_DIR = 'C:\\Users\\myname\\Desktop\\C008_Start' TARGET_DIR = 'C:\\Users\\myname\\Desktop\\Python' def rename_files(): """批量重命名源文件夹中的文件,支持文件名细微差异""" for filename in os.listdir(SOURCE_DIR): match = re.search(r'\((\d+) of 4\)', filename) if match and filename.endswith('.xlsx'): file_num = match.group(1) new_filename = f"CDRL 10 Consumption - Monthly {file_num} of 4.xlsx" old_path = os.path.join(SOURCE_DIR, filename) new_path = os.path.join(SOURCE_DIR, new_filename) try: os.rename(old_path, new_path) print(f"✅ 重命名完成: {filename} → {new_filename}") except Exception as e: print(f"❌ 重命名失败 {filename}: {str(e)}") def move_files(): """将重命名后的文件移动到目标文件夹,自动覆盖旧文件""" expected_new_files = [f"CDRL 10 Consumption - Monthly {i} of 4.xlsx" for i in range(1,5)] for filename in expected_new_files: source_path = os.path.join(SOURCE_DIR, filename) target_path = os.path.join(TARGET_DIR, filename) try: if os.path.exists(source_path): if os.path.exists(target_path): os.remove(target_path) print(f"🗑️ 删除旧文件: {filename}") shutil.move(source_path, target_path) print(f"🚚 移动完成: {filename} → {TARGET_DIR}") else: print(f"⚠️ 待移动文件不存在: {filename}") except Exception as e: print(f"❌ 移动失败 {filename}: {str(e)}") if __name__ == "__main__": rename_files() move_files()
这个版本的代码:
- 彻底消除了重复代码,用循环和正则处理所有文件
- 避免了
os.chdir带来的工作目录混乱问题 - 加入了错误处理和友好的提示信息
- 完整实现了文件移动功能
- 用函数拆分功能,代码结构更清晰易维护
内容的提问来源于stack exchange,提问作者conrito345
相关产品推荐
相关产品推荐

