【问题标题】:How can I use an utf-8 file name retrieved from a YAML file for os.path.isdir()?如何使用从 YAML 文件中检索到的 utf-8 文件名用于 os.path.isdir()?
【发布时间】:2019-06-13 10:27:56
【问题描述】:

我正在从 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 字典)转储到配置文件:

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

【问题讨论】:

  • 请扩展您的帖子(同时保持它是一个连贯的整体,所以不要编辑:),在那里您提供一个完整的、最小的程序。你究竟是如何制作文件的,你是从 YAML 中转储的吗?我的猜测是文件打开"r",它可能应该打开"rb",或者YAML文件的编码是UTF-16,没有可识别/可识别的BOM。
  • 哇,你的建议奏效了。太感谢了!我应该如何让其他人知道您的评论有效?编辑我的帖子并参考您的回答?
  • 我会写一个答案,但让你的问题更完整一点仍然有用。
  • 完成。编辑好了吗?
  • 看起来更完整,谢谢!

标签: python utf-8 yaml ruamel.yaml


【解决方案1】:

在大多数示例中,您会看到从磁盘读取 YAML 文件是通过以下方式完成的:

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

那个开放,是开放阅读(和open("config.yaml", "r")一样)。这在 Linux 上很好,或者在 Windows 上使用 ASCII/文本文件。但为了让 YAML 解析器在 Windows 上正确处理非 ASCII 输入,您应该以读取二进制模式打开文件:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2012-04-26
    • 2017-11-17
    • 1970-01-01
    • 2016-07-27
    • 2012-10-10
    相关资源
    最近更新 更多