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

Python使用input()获取目录路径时遭遇unicodeescape解码错误求助

问题描述

尝试通过input()接收用户输入的目录路径并扫描,但程序抛出以下错误:

(unicode error) 'unicodeescape' codec can't decode bytes in position 320-321: truncated \UXXXXXXXX escape

当前无法运行的代码:

import os
import time

print("Enter directory name.\nDirectory name example:\nC:\Users\example\Documents")

dirname = input()

with os.scandir(dirname) as dir_entries:
    for entry in dir_entries:
        info = entry.stat()
        file_name = os.path.basename(entry)

        my_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(info.st_ctime))
        rawmb = (info.st_size/(1024*1024))
        truncated = round(rawmb, 3)

        print(file_name)
        print(my_time)
        print(truncated,"MB")
        print('===========================')

需求说明:不想让用户手动将路径中的\替换为\\或/,希望直接支持从文件管理器复制的路径;尝试过给input()返回的字符串加r前缀、使用.decode/.encode但无效。

编辑#1:尝试执行for ch in dirname: print(ch, ord(ch))后,仍出现相同错误。


解决方案

错误根源

Windows路径中的\在Python中会被当作转义符,当路径包含\U(比如C:\Users\...)时,Python会尝试将其解析为Unicode转义序列(要求\U后跟8位十六进制字符),但你的路径中\U后是普通字符s,因此触发解码错误。

方案1:用os.path.normpath标准化路径

直接对input()返回的路径做标准化处理,自动修复转义问题,无需用户修改输入:

import os
import time

# 注意:示例路径改用raw字符串,避免自身触发转义错误
print(r"Enter directory name.\nDirectory name example:\nC:\Users\example\Documents")

dirname = os.path.normpath(input())  # 关键修改:添加路径标准化处理

with os.scandir(dirname) as dir_entries:
    for entry in dir_entries:
        info = entry.stat()
        file_name = os.path.basename(entry)

        my_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(info.st_ctime))
        rawmb = (info.st_size/(1024*1024))
        truncated = round(rawmb, 3)

        print(file_name)
        print(my_time)
        print(truncated,"MB")
        print('===========================')

方案2:使用pathlib模块(推荐)

Python 3.4+自带的pathlib模块对路径处理更友好,完全无需关注转义问题:

import time
from pathlib import Path

# 用raw字符串避免示例路径触发错误
print(r"Enter directory name.\nDirectory name example:\nC:\Users\example\Documents")

dirname = input()
dir_path = Path(dirname)

# 遍历目录条目
for entry in dir_path.iterdir():
    info = entry.stat()
    file_name = entry.name  # 直接获取文件名,无需os.path.basename
    my_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(info.st_ctime))
    truncated = round(info.st_size / (1024*1024), 3)
    
    print(file_name)
    print(my_time)
    print(truncated, "MB")
    print('===========================')

补充说明

  • .decode/.encode是用于字节与字符串的转换,和转义符解析无关,因此无效;
  • r前缀是字符串定义时的语法,无法给已存在的字符串添加,所以直接加前缀的思路不成立;
  • 原代码中的示例路径C:\Users\example\Documents本身就会触发转义错误,需改为raw字符串r"C:\Users\example\Documents"或转义\\。

内容的提问来源于stack exchange,提问作者BurninDreamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:50:34