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

时间:2019-01-19 10:27:35

标签: python utf-8 yaml ruamel.yaml

我正在从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()可以找到该文件?

1 个答案:

答案 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)