我正在从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/\xc3\xbc
。
要从配置文件中检索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/\xc3\x83\xc2\xbc'
区别从何而来?如何转换从配置文件加载的值,以便os.path.isdir()可以找到该文件?
答案 0 :(得分:2)
在大多数示例中,您将看到使用以下方法从光盘读取YAML文件:
yaml = ruamel.yaml.YAML()
with open('config.yaml') as fp:
yaml.load(fp)
该开放空间是可供阅读的开放空间(与open("config.yaml", "r")
一样)。在Linux上或使用ASCII /文本文件的Windows上都可以。但是,为了使YAML解析器能够正确处理Windows上的非ASCII输入,您应该以读取二进制模式打开文件:
yaml = ruamel.yaml.YAML()
with open('config.yaml', 'rb') as fp:
yaml.load(fp)