使用os.rename批量重命名文件时遇WinError 123语法错误求助
问题分析与解决方案
错误根源
- 换行符污染文件名:
readlines()会保留每行末尾的\n,导致生成的目标文件名包含非法换行字符,Windows系统不允许文件名存在这类字符,触发WinError 123。 - 名称读取方式错误:你的Names.txt是空格分隔的名称,
readlines()会把整个内容读成单个字符串元素,无法直接通过索引获取单个名称。 - 索引起始值错误:列表索引从0开始,但你设置
count = 1,会导致索引错位甚至越界。 - 路径拼接不规范:直接用
+拼接路径容易出现斜杠问题,且未处理子文件夹的情况。
修正后的代码
import os # 读取Names.txt,按空格拆分名称并清理空白字符 with open("Names.txt", "r") as f: content = f.read().strip() names = content.split() folder = r'C:\Users\e007l\Desktop\Rename' # 过滤出文件夹中的文件(排除子文件夹) files = [f for f in os.listdir(folder) if os.path.isfile(os.path.join(folder, f))] # 确保名称数量和文件数量匹配,避免索引越界 if len(names) != len(files): print("错误:Names.txt中的名称数量与文件夹内文件数量不匹配") else: # 遍历文件和对应的名称 for idx, file_name in enumerate(files): source = os.path.join(folder, file_name) # 如果要保留原文件扩展名,替换下面两行注释内容 # ext = os.path.splitext(file_name)[1] # destination = os.path.join(folder, f"{names[idx]}{ext}") # 统一改为txt扩展名 destination = os.path.join(folder, f"{names[idx]}.txt") os.rename(source, destination) # 打印重命名后的文件列表 print(os.listdir(folder)) print(folder)
关键改进点
- 正确读取名称:用
read().strip()读取整个文件内容并去掉首尾空白,再用split()按空格拆分得到干净的名称列表。 - 路径处理规范:用
os.path.join()拼接路径,自动适配Windows的路径分隔符,避免手动拼接的错误。 - 过滤文件:只处理文件夹中的文件,跳过子文件夹,避免误操作。
- 索引匹配:用
enumerate直接获取文件的索引,对应名称列表的索引,避免count变量的混乱。 - 数量校验:提前检查名称和文件数量是否一致,防止索引越界。
内容的提问来源于stack exchange,提问作者Zey
相关产品推荐
相关产品推荐

