Python Yaml加载将字符串转换为UTF8?
我有一个YAML: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
---
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”。您正在使用设计的语言。