根据文件名归类文件时遭遇UnicodeEncodeError问题求助
解决文件整理脚本的Unicode编码错误及逻辑问题
编码错误的原因与解决
你遇到的UnicodeEncodeError是因为Windows默认命令行编码为cp1252,而文件名里包含了该编码无法识别的Unicode字符,执行print时触发报错。
解决方式任选其一:
- 直接删除
print(os.path.splitext(f))这行调试代码(如果不需要输出文件名的话) - 在脚本开头添加以下代码,强制标准输出使用UTF-8编码:
import sys sys.stdout.reconfigure(encoding='utf-8')
- 改用
os.scandir()遍历文件,它对Unicode文件名的支持更稳定:
for entry in os.scandir(): if entry.is_file(): f = entry.name # 后续逻辑不变
代码逻辑的错误修正
你的代码还有几个核心逻辑问题:
shutil.move参数错误:第一个参数应该是要移动的文件名f,而非os.chdir(这是一个函数对象)- 仅处理了含"vba"的文件,未实现"excel"和"python"的分类逻辑
- 未检查目标文件夹是否存在,移动前需先创建(避免报错)
修正后的完整代码
import os import shutil import sys # 可选:解决命令行编码问题 sys.stdout.reconfigure(encoding='utf-8') # 定义路径 root_dir = r"C:\Users\RMBORGE\Desktop\Useful stuff" excel_dir = os.path.join(root_dir, "Excel") python_dir = os.path.join(root_dir, "Python") # 创建目标文件夹(不存在则新建) for folder in [excel_dir, python_dir]: if not os.path.exists(folder): os.makedirs(folder) # 遍历并整理文件 for f in os.listdir(root_dir): file_path = os.path.join(root_dir, f) # 只处理文件,跳过文件夹 if not os.path.isfile(file_path): continue filename_lower = f.lower() # 转为小写,避免大小写敏感 if "vba" in filename_lower or "excel" in filename_lower: shutil.move(file_path, excel_dir) elif "python" in filename_lower: shutil.move(file_path, python_dir)
代码说明
- 用
os.path.join拼接路径,避免手动写路径时出错 - 文件名转小写,确保"VBA""Excel"这类大小写变体也能被匹配
- 先检查目标文件夹是否存在,不存在则自动创建
- 跳过目录,只处理文件,避免误移动文件夹
内容的提问来源于stack exchange,提问作者python noobie
相关产品推荐
相关产品推荐

