You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

根据文件名归类文件时遭遇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
        # 后续逻辑不变

代码逻辑的错误修正

你的代码还有几个核心逻辑问题:

  1. shutil.move参数错误:第一个参数应该是要移动的文件名f,而非os.chdir(这是一个函数对象)
  2. 仅处理了含"vba"的文件,未实现"excel"和"python"的分类逻辑
  3. 未检查目标文件夹是否存在,移动前需先创建(避免报错)

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:06:16