使用pandas按Excel A1单元格内容批量重命名文件时报AttributeError如何解决
报错根因
glob.glob() 返回的所有文件路径都是纯字符串类型,字符串对象本身不具备 .rename()、.with_name() 这两个属于 pathlib.Path 类的方法,直接调用就会触发 AttributeError: 'str' object has no attribute 'rename'。
另外你调试代码时误把 new_name 包成了固定的f-string字面量 f"new_name",就算对象类型修正了,也会把所有文件重命名成同一个叫 new_name 的文件,和你预期读取A1单元格值命名的逻辑完全不符。
修复方案
二选一实现即可,不需要改动过多原有逻辑:
方案1:适配现有字符串路径逻辑(原生os模块)
不需要额外引入新依赖,把原代码中调用字符串不存在方法的部分替换为os模块的重命名接口,关键调整点:
- 读取Excel时增加
header=None参数:pandas默认会把读取到的第一行识别为列名,此时用iat[0,0]取到的是数据区第一行第一列的内容,根本不是Excel里的A1单元格,加这个参数才能跳过表头识别,直接按单元格绝对位置取值 - 新文件名必须拼接完整的目录路径,否则会把文件移动到脚本运行的当前工作目录下
- 把单元格取值强制转为字符串、去掉首尾冗余空格,避免非字符串类型的单元格值导致路径拼接报错
完整可运行代码:
import os import pandas as pd import glob source_dir = r'C:\Users\Ahmed_Abdelmuniem\Desktop\RenameFolder' file_names = glob.glob(os.path.join(source_dir, '*.xlsx')) for old_full_path in file_names: # 按单元格位置读取,不识别表头,直接定位A1单元格 df1 = pd.read_excel(old_full_path, header=None) new_name = str(df1.iat[0, 0]).strip() # 拼接新文件的完整存储路径 new_full_path = os.path.join(source_dir, new_name) # 执行重命名 os.rename(old_full_path, new_full_path)
方案2:保留原代码的Path类调用写法
如果习惯用Path对象的链式调用逻辑,把原来用glob返回字符串路径的部分,替换成Path类自带的glob方法,遍历得到的每个文件都是Path对象,自带 .rename()、.with_name() 方法,不会触发属性不存在的错误:
from pathlib import Path import pandas as pd source_dir = Path(r'C:\Users\Ahmed_Abdelmuniem\Desktop\RenameFolder') for file_path in source_dir.glob('*.xlsx'): df1 = pd.read_excel(file_path, header=None) new_name = str(df1.iat[0, 0]).strip() # 直接用Path对象的内置方法完成重命名 file_path.rename(file_path.with_name(new_name))
注意事项
- 提前检查A1单元格取出的内容,不能包含Windows系统禁止的文件名字符:
\ / : * ? " < > |,否则会触发路径非法的报错 - 重命名前增加判断逻辑:如果目标新文件已经存在,提前跳过或者给文件名加序号后缀,避免重名导致的文件被意外覆盖
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

