首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyYaml -使用特殊字符(即重音符号)转储unicode

PyYaml -使用特殊字符(即重音符号)转储unicode
EN

Stack Overflow用户
提问于 2015-03-30 17:33:22
回答 2查看 12.4K关注 0票数 20

我正在处理yaml文件,这些文件必须是人类可读和可编辑的,但也可以从Python代码进行编辑。我使用的是Python 2.7.3

该文件需要处理重音(主要是处理法语文本)。

以下是我的问题的一个示例:

代码语言:javascript
复制
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()

写入的文件包含:

代码语言:javascript
复制
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加载,但它不是人类可读的。

正如您在示例代码中看到的,当我尝试编写字典的unicode表示时,结果是相同的(我不知道它是否相关)。

我希望转储包含带有重音的文本,而不是unicode代码。这有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-13 15:37:44

通过向任何转储程序提供allow_unicode=True关键字参数,yaml能够转储unicode字符。如果不提供文件,您将从dump()方法(即,为保存转储数据而创建的StringIO()实例上的getvalue()的结果)获得一个utf-8字符串,并且在将其追加到字符串之前必须将其转换为utf-8

代码语言:javascript
复制
# 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())

输出:

代码语言:javascript
复制
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本身应该是一样的。

票数 26
EN

Stack Overflow用户

发布于 2020-11-19 06:00:24

更新(2020)

现在,PyYaml确实很容易使用Python3,来处理unicode,但是这需要allow_unicode=True参数:

代码语言:javascript
复制
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)

将导致:

代码语言:javascript
复制
a: héhéhé
b: hühühü

注释sortkeys=False参数应该从Python3.6开始使用,以使字典的键保持不变。PyYaml传统上是对键进行排序,因为Python字典没有明确的顺序。尽管字典关键字从Python3.6和officially since 3.7开始就已经排序,但PyYaml默认情况下一直保持关键字的排序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29342757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档