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
相关产品推荐
相关产品推荐

