Windows下如何将YAML读取的UTF-8路径用于os.path.isdir()?
UTF-8路径从yaml加载后os.path.isdir()返回False?看这篇解决
嘿,这个问题本质是文件读写时编码不统一导致的双重UTF-8编码,我来给你拆解清楚:
为啥会出现这个差异?
你写入config.yml的时候,明确加了encoding='utf-8',把路径里的ü正确转成了UTF-8字节\xc3\xbc;但读文件的时候没指定编码,Python就用了Windows系统的默认编码(一般是cp1252或者跟你系统区域相关的编码)来解码。
原本的\xc3\xbc(对应ü的UTF-8编码),被系统默认编码解码后,变成了两个字符:Ã和¼。等你再把这个错误的字符串转成UTF-8编码,就得到了\xc3\x83\xc2\xbc——这就是你看到编码不一样的原因。这个被“转码两次”的字符串,自然找不到实际存在的目录。
怎么解决?
很简单,读yaml文件的时候跟写入时保持编码一致,明确指定encoding='utf-8'就行:
from ruamel.yaml import YAML import os yaml = YAML() # 关键:读取时指定utf-8编码 with open('config.yaml', encoding='utf-8') as cfg: user_data = yaml.load(cfg) root_path = user_data['destination']['root_path'] # 现在再测就正常了 print(os.path.isdir(root_path)) # 应该返回True
验证一下
你可以再打印编码值确认:
print(root_path.encode('utf-8')) # 现在会输出b'C:/Users/Name/Desktop/\xc3\xbc',和硬编码的结果完全一致
为啥硬编码就没问题?
硬编码的'C:/Users/Name/Desktop/ü',Python会直接按照你代码文件的编码(只要你代码文件是UTF-8,而且头部加了# -*- coding: utf-8 -*-)正确解析,不会有中间转码的错误,所以能精准匹配实际路径。
内容的提问来源于stack exchange,提问作者jonasstr
相关产品推荐
相关产品推荐

