Python Yaml加载将字符串转换为UTF8?

Python Yaml加载将字符串转换为UTF8?,python,character-encoding,yaml,Python,Character Encoding,Yaml,我有一个YAML: --- test: {"gender":0,"nacionality":"Alem\u00e3o"} 我使用python 3.5阅读它,如下所示: with open('teste.yaml', 'r') as stream: doc = yaml.load_all(stream) for line in doc: print(line) 这是我得到的结果: {'test': {'gender': 0, 'nacionality': 'Al

我有一个YAML:

---
test: {"gender":0,"nacionality":"Alem\u00e3o"}
我使用python 3.5阅读它,如下所示:

with open('teste.yaml', 'r') as stream:
    doc = yaml.load_all(stream)
    for line in doc:
        print(line)
这是我得到的结果:

{'test': {'gender': 0, 'nacionality': 'Alemão'}}
但是如果我在YAML中更改
”的
,我会得到以下结果:

{'test': {'nacionality': 'Alem\\u00e3o', 'gender': 0}}
正如您所看到的,当我使用
时,字符串
Alem\\u00e3o
被转换为UTF,但使用
则不会

所以我有两个问题:

为什么在使用
时会得到不同的输出?

使用
”时,如何将输出设置为
Alem\\u00e3o

YAML数据格式就是这样定义的。在双引号中,解释特定的转义序列。在单引号中,它们不是

7.3.1。双引号样式

双引号样式由周围的“\”指示符指定。这是唯一能够通过使用“\”转义序列来表示任意字符串的样式。这是以必须转义“\”和“\”字符为代价的


在使用“”时,如何将输出获取为Alem\u00e3o

转义转义字符:

test: {"gender":0,"nacionality":"Alem\\u00e3o"}

YAML数据格式就是这样定义的。在双引号中,解释特定的转义序列。在单引号中,它们不是

7.3.1.双引号样式

双引号样式由周围的“”指示符指定。这是唯一能够通过使用“\”转义序列表达任意字符串的样式。这是以必须转义“\”和“\”字符为代价的


在使用“”时,如何将输出获取为Alem\u00e3o

转义转义字符:

test: {"gender":0,"nacionality":"Alem\\u00e3o"}

YAML中的反斜杠转义仅在双引号标量中可用。不在单引号标量、非引号或(文字)块标量中

要获得所需的输出,最好的方法是将引号放在一起,并将其用作输入:

---
test: {gender: 0, nacionality: Alem\u00e3o}
然而,您的程序有待改进

  • 您不应该在这种未标记的YAML上使用
    load\u all()
    load()
    。这是不安全的,如果您不能完全控制源YAML,则可能导致在您的计算机上执行任意代码。如果没有明确指定不安全的加载程序作为参数,更新版本的
    ruamel.yaml
    将抛出警告。帮自己一个忙,养成使用
    safe\u load()
    safe\u load\u all()
    的习惯
  • load_all()
    返回对文档的迭代器,因此使用
    doc
    line
    是误导变量名。你应使用:

    import ruamel.yaml as yaml
    
    with open('teste.yaml', 'r') as stream:
        for doc in yaml.safe_load_all(stream):
            print(doc)
    
    或者如果
    teste.yaml
    中总是只有一个文档,您可以将其简化为:

    import ruamel.yaml as yaml
    
    with open('teste.yaml') as stream:
        print(yaml.safe_load(stream))
    
    这两项都将为您提供:

    {'test': {'gender': 0, 'nacionality': 'Alem\\u00e3o'}}
    
  • 请注意,在YAML中,必须在映射中分隔键和值的
    后面有空格。只有在与JSON兼容的情况下,才允许删除空格,前提是引用了键(双引号和单引号都有效)。因此,这也可以作为输入:

    ---
    test: {"gender":0, 'nacionality':Alem\u00e3o}
    

    YAML中的反斜杠转义仅在双引号标量中可用。不在单引号标量、非引号或(文字)块标量中

    要获得所需的输出,最好的方法是将引号放在一起,并将其用作输入:

    ---
    test: {gender: 0, nacionality: Alem\u00e3o}
    
    然而,您的程序有待改进

  • 您不应该在这种未标记的YAML上使用
    load\u all()
    load()
    。这是不安全的,如果您不能完全控制源YAML,则可能导致在您的计算机上执行任意代码。如果没有明确指定不安全的加载程序作为参数,更新版本的
    ruamel.yaml
    将抛出警告。帮自己一个忙,养成使用
    safe\u load()
    safe\u load\u all()
    的习惯
  • load_all()
    返回对文档的迭代器,因此使用
    doc
    line
    是误导变量名。你应使用:

    import ruamel.yaml as yaml
    
    with open('teste.yaml', 'r') as stream:
        for doc in yaml.safe_load_all(stream):
            print(doc)
    
    或者如果
    teste.yaml
    中总是只有一个文档,您可以将其简化为:

    import ruamel.yaml as yaml
    
    with open('teste.yaml') as stream:
        print(yaml.safe_load(stream))
    
    这两项都将为您提供:

    {'test': {'gender': 0, 'nacionality': 'Alem\\u00e3o'}}
    
  • 请注意,在YAML中,必须在映射中分隔键和值的
    后面有空格。只有在与JSON兼容的情况下,才允许删除空格,前提是引用了键(双引号和单引号都有效)。因此,这也可以作为输入:

    ---
    test: {"gender":0, 'nacionality':Alem\u00e3o}
    

    用单引号代替双引号可以吗?它的工作方式是否与转义字符的转义相同?确定它是“ok”。您正在使用设计的语言。使用单引号而不是双引号可以吗?它的工作方式是否与转义字符的转义相同?确定它是“ok”。您正在使用设计的语言。