Python根据CSV文件id列批量重命名文件报TypeError排查
问题场景
- 存在一个CSV文件,包含名为
id的列 - 存在一个存储待处理文件的目录,需要根据
id列的单元格值,批量重命名目录内的对应文件
原始实现代码:
import pandas as pd import os path = os.chdir('/Users/Utilizador/pythonProjects/files') df = pd.read_csv('/Users/Utilizador/pythonProjects/todos-cantar-palavras.csv', encoding='utf8') i = 0 for file in os.listdir(path): new_file_name = df['id'] os.rename(file, new_file_name) i = i + 1
运行代码后抛出错误:
TypeError: rename: dst should be string, bytes or os.PathLike, not Series
错误原因
代码存在3个核心问题:
df['id']返回的是pandas的整列Series对象,不是单个字符串值,os.rename要求目标文件名必须是字符串、字节或路径类型对象,传入整列数据直接触发类型错误os.chdir()的作用是切换当前工作目录,返回值为None,将其赋值给path后,os.listdir(path)等价于os.listdir(None),本身就无法正确获取目录下的文件列表- 逻辑缺少必要校验:既没有跳过目录、隐藏文件,也没有保留原文件扩展名,更没有校验文件数量和id数量是否一致,就算解决类型错误也会出现文件错位、格式丢失、误改目录的问题
修复代码
import pandas as pd import os # 配置固定路径,不依赖chdir切换工作目录 FILE_DIR = '/Users/Utilizador/pythonProjects/files' CSV_PATH = '/Users/Utilizador/pythonProjects/todos-cantar-palavras.csv' # 读取id列,统一转字符串避免数值id导致的文件名异常 df = pd.read_csv(CSV_PATH, encoding='utf8') name_list = df['id'].astype(str).tolist() # 筛选目录下的普通文件,排除子目录、隐藏文件,按名称排序保证顺序一致 file_list = sorted([ item for item in os.listdir(FILE_DIR) if os.path.isfile(os.path.join(FILE_DIR, item)) and not item.startswith('.') ]) # 前置校验,避免数量不匹配导致的文件名错位 if len(file_list) != len(name_list): raise RuntimeError(f"校验失败:目录内文件数为{len(file_list)},CSV内id数为{len(name_list)},两者不匹配") # 批量重命名 for old_filename, new_file_id in zip(file_list, name_list): # 保留原文件扩展名 file_ext = os.path.splitext(old_filename)[1] old_full_path = os.path.join(FILE_DIR, old_filename) new_full_path = os.path.join(FILE_DIR, f"{new_file_id}{file_ext}") os.rename(old_full_path, new_full_path)
关键修改说明
- 移除错误的
path = os.chdir()写法,全程用绝对路径拼接处理文件,避免工作目录带来的路径异常 - 将id列转为字符串列表,遍历过程中逐个取单个id作为新文件名,解决核心的类型报错
- 增加文件筛选逻辑,自动跳过子目录、系统隐藏文件,避免误操作
- 增加前置数量校验,文件数和id数不一致时直接终止运行,防止文件名错位覆盖
- 重命名时自动提取原文件的扩展名,不会破坏文件原有格式
- 所有路径通过
os.path.join拼接,兼容Windows、macOS、Linux不同系统的路径规则
内容的提问来源于stack exchange,提问作者sorlac
相关产品推荐
相关产品推荐

