日常工作中总会遇到一些需要收集文件的情况,即便在收集前千叮咛万嘱咐,告知大家文件命名规则为 “编号-项目名称”,可最后收集回来的文件,名称依旧五花八门。有的使用横杠作为分隔符,有的却用下划线;编号错误的情况时有发生,甚至连项目名称也写错,这无疑给后续的文件整理和数据分析工作带来了极大的困扰。
比如,我们有一份正确的编号和项目名称对应关系的excel表格,内容如下:
编号 | 项目名称 |
---|---|
250211 | 苹果 |
250212 | 香蕉 |
250216 | 桃子 |
按照规范,收集到的文件命名应该是 “250211-苹果.docx”、“250212-香蕉.docx”、“250216-桃子.docx” 。但现实总是很残酷,实际收集到的文件却是 “250211_苹果.docx”(分隔符错误)、“2502122-香蕉.docx”(编号错误)、“250216-橘子.docx”(项目名称错误)。面对如此混乱的文件命名,人工逐一修改不仅耗时费力,还容易出错,这时我们急需工具进行批量重命名。python作为强大的编程语言,能够高效解决这类问题,接下来就让我们看看如何通过python实现批量重命名操作。
1. 需求分析
面对这些混乱的文件命名,我们需要解决以下关键问题:
统一分隔符: 将所有文件中不同的分隔符,如横杠、下划线等,全部替换为指定的横杠分隔符。
检查编号错误: 以excel表格中的编号为基准,检查文件名中的编号是否有错误,如出现编号重复或编号不在excel中则提醒人工检查。
纠正项目名称: 根据excel表格中的映射关系,把错误的项目名称替换为正确的名称。
2. 安装依赖库
为达成上述功能,我们会运用python的os库处理文件操作,re库进行正则表达式匹配与字符串替换,pandas库读取excel文件中的映射关系。
在开始编写代码前,要确保已经安装了pandas库。若未安装,可通过以下命令进行安装:
pip install pandas
3. 代码实现
以下代码首先读取excel文件中的编号与项目名称对应关系,然后遍历当前目录下的所有文件。对于每个文件,先统一分隔符,再检查编号是否正确,最后根据excel中的映射关系纠正项目名称,并完成文件的重命名操作。在执行过程中,对于出现错误的文件,会给出相应的提示信息,方便人工进行检查和处理。
3.1 rename.py
import os import pandas as pd import re def rename_files(excel_path, old_files_path, new_files_path): # 获取当前脚本所在目录 parent = os.path.dirname(os.path.realpath(__file__)) # 构建 excel 文件的完整路径 excel_path = os.path.join(parent, excel_path) # 构建待重命名文件所在目录的完整路径 old_files_path = os.path.join(parent, old_files_path) # 构建重命名后文件存放目录的完整路径 new_files_path = os.path.join(parent, new_files_path) # 检查 excel 文件是否存在 try: df = pd.read_excel(excel_path) except filenotfounderror: print(f"未找到 excel 文件: {excel_path}") return # 检查待重命名文件目录是否存在 if not os.path.exists(old_files_path): print(f"待重命名文件目录 {old_files_path} 不存在。") return # 检查重命名后文件存放目录是否存在,若不存在则创建 if not os.path.exists(new_files_path): os.makedirs(new_files_path) # 将编号列转换为字符串格式 df["编号"] = df["编号"].astype(str) # 将编号和项目名称转换为字典 id_name_dict = dict(zip(df["编号"], df["项目名称"])) # 获取待重命名目录下所有文件 file_list = os.listdir(old_files_path) for file in file_list: file_path = os.path.join(old_files_path, file) if os.path.isfile(file_path): # 分离文件名和扩展名 file_name, file_extension = os.path.splitext(file) # 检查并替换分隔符 new_file_name = re.sub(r"[_/\\]", "-", file_name) parts = new_file_name.split("-") if len(parts) != 2: print(f"文件 {file} 命名格式错误,无法解析。") continue file_id, project_name = parts[0], parts[1] # 检查编号是否正确 if file_id not in id_name_dict.keys(): print(f"文件 {file} 中的编号 {file_id} 错误,请人工检查。") continue # 纠正项目名称 correct_project_name = id_name_dict[file_id] if project_name != correct_project_name: new_file_name = f"{file_id}-{correct_project_name}" new_file = new_file_name + file_extension new_file_path = os.path.join(new_files_path, new_file) # 重命名并移动文件 try: os.rename(file_path, new_file_path) except fileexistserror: print(f"文件 {new_file} 已存在于 {new_files_path},无法重命名 {file}。") # 示例调用 if __name__ == "__main__": rename_files("example.xlsx", "old_files", "new_files")
3.2 代码说明
1. 函数定义与路径处理:
- rename_files 函数接收三个参数:excel_path(excel文件路径)、old_files_path(待重命名文件目录路径)、new_files_path(重命名后文件存放目录路径)。
- 通过 os.path.dirname(os.path.realpath(__file__)) 获取当前脚本所在目录,再用 os.path.join 拼接路径,确保跨平台兼容性。
2. 文件与目录检查:
- 尝试读取excel文件,若文件不存在,捕获异常并提示,终止函数。
- 检查待重命名文件目录是否存在,不存在则提示并终止。
- 检查重命名后文件存放目录,不存在则创建。
3. 数据处理与字典构建:
- 将 df["编号"] 列转为字符串类型,方便与文件名编号比较。
- 利用 dict(zip(df["编号"], df["项目名称"])) 构建编号与项目名称的字典映射。
4. 文件遍历与重命名:
- 获取待重命名目录下所有文件。
- 对每个文件,检查是否为文件,分离文件名与扩展名。
- 用正则表达式替换分隔符,按横杠拆分文件名。
- 检查编号是否在字典中,不在则提示编号错误并跳过。
- 对比项目名称,不一致则纠正,构建新文件名。
- 尝试重命名并移动文件,若目标文件已存在,捕获异常并提示。
4. 运行示例
假设文件结构如下:
project/
├── rename.py
├── example.xlsx
├── old_files/
│ ├── 250211_苹果.docx
│ ├── 2502122-香蕉.docx
│ ├── 250216-橘子.docx
└── new_files/ (初始为空)
其中 example.xlsx
内容如下:
编号 | 项目名称 |
---|---|
250211 | 苹果 |
250212 | 香蕉 |
250216 | 桃子 |
在命令行进入 project 目录,执行 python rename.py 后,new_files 目录下会生成:
new_files/
├── 250211-苹果.docx
├── 250216-桃子.docx
同时,控制台输出:
文件 2502122_香蕉.docx 中的编号 2502122 错误,请人工检查。
250211_苹果.docx 因分隔符错误,重命名为 250211-苹果.docx 并移动到 new_files 目录;2502122-香蕉.docx 因编号错误未重命名移动;250216-橘子.docx 因项目名称错误,重命名为 250216 - 桃子.docx 并移动到 new_files 目录。
5. 注意事项
备份文件: 在执行批量重命名之前,务必对重要文件进行备份,防止因代码错误导致文件丢失或损坏。
测试代码: 在处理大量文件之前,先在少量样本文件上测试代码,确保重命名规则符合预期。
路径兼容性: 不同操作系统路径分隔符不同(windows 下是 \,linux 和 macos 下是 /),建议使用 os.path.join 拼接路径,增强跨平台兼容性。
xlsx 文件格式: 确保xlsx文件包含 “编号” 和 “项目名称” 两列,数据准确无误,编号作为唯一标识不能重复。
文件权限: 运行代码的用户需对 old_files_path 和 new_files_path 目录有读写权限,否则可能导致运行错误。
编码问题: 若excel文件或文件名含非ascii字符,注意编码问题,确保读取和处理文件时编码正确,避免乱码。
6. 总结
通过 python 实现的批量重命名功能,能够高效地解决工作中文件命名不一致的问题。无论遇到多么复杂的命名混乱情况,只要合理运用python的库和函数,都能轻松应对。
到此这篇关于利用python实现文档批量重命名的文章就介绍到这了,更多相关python重命名内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论