【发布时间】: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