You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

【入门级】如何优化这份文件重命名与清理的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:02:31