如何将从YAML文件中检索到的utf-8文件名用于os.path.isdir()



我正在从config.yml文件加载文件夹路径。示例名称:C:/Users/Name/Desktop/ü,它包含一个utf-8字符。当我使用yaml.load(config)加载此路径(我使用的是ruamel.yaml),然后使用加载的值检查此目录是否存在os.path.isdir()时,即使文件存在,我也总是返回"False"。(在Windows上)

但是,当我尝试检查文件是否存在像root_path = 'C:/Users/Name/Desktop/ü'这样的硬编码字符串时,我得到"True"。

我使用yaml.dump()将数据(一个python dict)转储到配置文件中:

with open(path_to_config, 'w', encoding='utf-8') as config:
yaml.dump(data, config)

在文本编辑器中打开时如下所示:

destination:
root_path: C:/Users/Name/Desktop/ü

将硬编码值打印到控制台显示:

C:/Users/Name/Desktop/▒

或使用print(root_path.encode('utf-8')):时

b'C:/Users/Name/Desktop/xc3xbc

要从配置文件中检索root_path,我使用:

with open('config.yaml') as cfg:
user_data = yaml.load(cfg)
root_path = user_data['destination']['root_path']

当我打印从config.yml文件检索到的root_path时,我得到了:

C:/Users/Name/Desktop/ü

并使用print(root_path.encode('utf-8')):

b'C:/Users/Name/Desktop/xc3x83xc2xbc'

这种差异来自哪里?我如何转换从配置文件加载的值,以便os.path.isdir()可以找到该文件?

在大多数示例中,您将看到从光盘读取YAML文件是使用:完成的

yaml = ruamel.yaml.YAML()
with open('config.yaml') as fp:
yaml.load(fp)

那个空位,就是一个空位(和做open("config.yaml", "r")一样)。当使用ASCII/text文件时,这在Linux或Windows上都可以。但是,为了让YAML解析器在Windows上正确处理非ASCII输入,您应该以读取二进制模式打开文件:

yaml = ruamel.yaml.YAML()
with open('config.yaml', 'rb') as fp:
yaml.load(fp)

最新更新