PyYaml - 转储带有特殊字符(即重音符号)的 unicode
PyYaml - Dump unicode with special characters ( i.e. accents )
我正在处理 yaml 文件,这些文件必须是人类可读和可编辑的,但也可以通过 Python 代码进行编辑。
我正在使用 Python 2.7.3
文件需要处理重音符号(主要是为了处理法语文本)。
这是我的问题示例:
import codecs
import yaml
file = r'toto.txt'
f = codecs.open(file,"w",encoding="utf-8")
text = u'héhéhé, hûhûhû'
textDict = {"data": text}
f.write( 'write unicode : ' + text + '\n' )
f.write( 'write dict : ' + unicode(textDict) + '\n' )
f.write( 'yaml dump unicode : ' + yaml.dump(text))
f.write( 'yaml dump dict : ' + yaml.dump(textDict))
f.write( 'yaml safe unicode : ' + yaml.safe_dump(text))
f.write( 'yaml safe dict : ' + yaml.safe_dump(textDict))
f.close()
写入的文件包含:
write unicode : héhéhé, hûhûhû
write dict : {'data': u'h\xe9h\xe9h\xe9, h\xfbh\xfbh\xfb\n'}
yaml dump unicode : "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"
yaml dump dict : {data: "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"}
yaml safe unicode : "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"
yaml safe dict : {data: "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"}
yaml 转储非常适合加载 yaml,但它不是人类可读的。
正如您在示例代码中看到的,当我尝试编写一个 dict 的 unicode 表示时,结果是相同的(我不知道它是否相关)。
我希望转储包含带重音的文本,而不是 unicode 代码。
这可能吗?
yaml
能够通过向任何转储程序提供 allow_unicode=True
关键字参数来转储 unicode 字符。如果您不提供文件,您将从 dump()
方法返回一个 utf-8 字符串(即 getvalue()
在 StringIO()
实例上的结果,该实例是为保存转储而创建的数据),你必须先将其转换为 utf-8
,然后再将其附加到你的字符串
# coding: utf-8
import codecs
import ruamel.yaml as yaml
file_name = r'toto.txt'
text = u'héhéhé, hûhûhû'
textDict = {"data": text}
with open(file_name, 'w') as fp:
yaml.dump(textDict, stream=fp, allow_unicode=True)
print('yaml dump dict 1 : ' + open(file_name).read()),
f = codecs.open(file_name,"w",encoding="utf-8")
f.write('yaml dump dict 2 : ' + yaml.dump(textDict, allow_unicode=True).decode('utf-8'))
f.close()
print(open(file_name).read())
输出:
yaml dump dict 1 : {data: 'héhéhé, hûhûhû'}
yaml dump dict 2 : {data: 'héhéhé, hûhûhû'}
我用我的增强版 PyYAML (ruamel.yaml) 对此进行了测试,但这在 PyYAML 本身中应该是一样的。
更新 (2020)
如今,PyYaml 可以轻松地使用 Python 处理 unicode 3,但是 这需要 allow_unicode=True
参数:
import yaml
d = {'a': 'héhéhé', 'b': 'hühühü'}
yaml_code = yaml.dump(d, allow_unicode=True, sort_keys=False)
print(yaml_code)
将导致:
a: héhéhé
b: hühühü
注意:自Python 3.6 起应使用sortkeys=False
参数,以保持字典的键不变。 PyYaml 传统上对键进行排序,因为 Python 字典没有明确的顺序。即使自 Python 3.6 以来已经订购了字典键;并且 officially since 3.7,PyYaml 默认保留排序键。
我正在处理 yaml 文件,这些文件必须是人类可读和可编辑的,但也可以通过 Python 代码进行编辑。 我正在使用 Python 2.7.3
文件需要处理重音符号(主要是为了处理法语文本)。
这是我的问题示例:
import codecs
import yaml
file = r'toto.txt'
f = codecs.open(file,"w",encoding="utf-8")
text = u'héhéhé, hûhûhû'
textDict = {"data": text}
f.write( 'write unicode : ' + text + '\n' )
f.write( 'write dict : ' + unicode(textDict) + '\n' )
f.write( 'yaml dump unicode : ' + yaml.dump(text))
f.write( 'yaml dump dict : ' + yaml.dump(textDict))
f.write( 'yaml safe unicode : ' + yaml.safe_dump(text))
f.write( 'yaml safe dict : ' + yaml.safe_dump(textDict))
f.close()
写入的文件包含:
write unicode : héhéhé, hûhûhû
write dict : {'data': u'h\xe9h\xe9h\xe9, h\xfbh\xfbh\xfb\n'}
yaml dump unicode : "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"
yaml dump dict : {data: "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"}
yaml safe unicode : "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"
yaml safe dict : {data: "h\xE9h\xE9h\xE9, h\xFBh\xFBh\xFB"}
yaml 转储非常适合加载 yaml,但它不是人类可读的。
正如您在示例代码中看到的,当我尝试编写一个 dict 的 unicode 表示时,结果是相同的(我不知道它是否相关)。
我希望转储包含带重音的文本,而不是 unicode 代码。 这可能吗?
yaml
能够通过向任何转储程序提供 allow_unicode=True
关键字参数来转储 unicode 字符。如果您不提供文件,您将从 dump()
方法返回一个 utf-8 字符串(即 getvalue()
在 StringIO()
实例上的结果,该实例是为保存转储而创建的数据),你必须先将其转换为 utf-8
,然后再将其附加到你的字符串
# coding: utf-8
import codecs
import ruamel.yaml as yaml
file_name = r'toto.txt'
text = u'héhéhé, hûhûhû'
textDict = {"data": text}
with open(file_name, 'w') as fp:
yaml.dump(textDict, stream=fp, allow_unicode=True)
print('yaml dump dict 1 : ' + open(file_name).read()),
f = codecs.open(file_name,"w",encoding="utf-8")
f.write('yaml dump dict 2 : ' + yaml.dump(textDict, allow_unicode=True).decode('utf-8'))
f.close()
print(open(file_name).read())
输出:
yaml dump dict 1 : {data: 'héhéhé, hûhûhû'}
yaml dump dict 2 : {data: 'héhéhé, hûhûhû'}
我用我的增强版 PyYAML (ruamel.yaml) 对此进行了测试,但这在 PyYAML 本身中应该是一样的。
更新 (2020)
如今,PyYaml 可以轻松地使用 Python 处理 unicode 3,但是 这需要 allow_unicode=True
参数:
import yaml
d = {'a': 'héhéhé', 'b': 'hühühü'}
yaml_code = yaml.dump(d, allow_unicode=True, sort_keys=False)
print(yaml_code)
将导致:
a: héhéhé
b: hühühü
注意:自Python 3.6 起应使用sortkeys=False
参数,以保持字典的键不变。 PyYaml 传统上对键进行排序,因为 Python 字典没有明确的顺序。即使自 Python 3.6 以来已经订购了字典键;并且 officially since 3.7,PyYaml 默认保留排序键。