【问题标题】:Pyyaml not reading (non-ascii) character correctly ("§")Pyyaml 未正确读取(非 ascii)字符(“§”)
【发布时间】:2021-06-08 10:17:38
【问题描述】:

我有以下文件 (sample.yml):

Key: §

当我尝试使用以下功能阅读时:

import yaml

with open("sample.yml", "r") as f:
    file = yaml.safe_load(f)

文件未正确读取:print(file) 返回

{'Key': '§'}

即使我想避免转义序列,在这种情况下是否可以使用这样的转义序列?没有它们有办法吗?

我也尝试将§ 设置为单引号('§')或双引号("§"),但是,这并没有解决问题。另外,使用yaml.load 而不是yaml.safe_load

我正在使用 pyyaml v5.4.1

如何正确读取yaml文件?

【问题讨论】:

  • § 没有什么特别之处,section mark。您发布的输出看起来就像您尝试将 UTF8 字符串 display 为 ASCII(特别是拉丁语)时得到的输出。在这种情况下,UTF8 字节表示为0xC2 0xA7。在拉丁文 1 中,0xA7§ 的值。要么你没有使用 Python 3,要么你的终端没有设置为显示 UTF8 字符
  • 简而言之,除了终端的设置,没有什么可修复的
  • 在这种情况下,file["Key"] == "§" 应该返回True,因为根据您的帖子,这应该只是终端显示问题。但是,它返回 False
  • 您使用的是哪个特定 Python 3 版本?现在,open 的默认编码是utf8。尽管它仍然使用系统的默认值,但在某种程度上。如果您使用旧版本,open() 可能会以 ASCII 格式读取文件
  • 您应该明确地传递编码以确定。来自open's documentationThe default encoding is platform dependent (whatever locale.getpreferredencoding() returns)

标签: python python-3.x yaml pyyaml


【解决方案1】:

您应该明确地传递编码以确定:

with open(filepath, "r", encoding="utf-8") as f:

来自open's documentation

默认编码取决于平台(无论 locale.getpreferredencoding() 返回什么)。

这对于 3.10 仍然适用,但将来可能会更改为 utf-8

虽然您发布的输出看起来像您尝试将 UTF8 字符串读取或显示为 ASCII(特别是拉丁语)时得到的结果。在这种情况下,§ 的 UTF8 字节表示为 0xC2 0xA7。 0xA7也是Latin1中的字节值,所以字符最终显示为§

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 2012-08-06
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2012-04-21
    • 2021-04-09
    相关资源
    最近更新 更多