我正在从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)