我使用pyyaml将对象转储到文件中。对象中有几个unicode字符串。我以前做过这个,但现在它正在生成这样的输出项:
'item': !!python/unicode "some string"
取代期望的:
'item': 'some string'
我打算输出为utf-8。我使用的当前命令是:
yaml.dump(data,file(suite_out,'w'),encoding='utf-8',indent=4,allow_unicode=True)
在其他地方,我会执行以下操作,它可以正常运行:
codecs.open(suite_out,"w","utf-8").write(
yaml.dump(suite,indent=4,width=10000)
)
我做错了什么?
Python 2.7.3
答案 0 :(得分:39)
我尝试了很多组合,我能找到的唯一能够始终产生正确YAML输出的组合是:
yaml.safe_dump(data, file(filename,'w'), encoding='utf-8', allow_unicode=True)
答案 1 :(得分:1)
受接受的答案启发,safe_dump
可以产生预期的结果,我检查了python2.7/site-packages/yaml/representer.py
的来源,发现Representer
为dump
和{{ 1}}对safe_dump
使用了不同的表示函数。
并且可以用unicode
覆盖表示函数。因此,您只需要从add_representer
获取代表函数,然后将其注册以在SafeRepresenter
中使用即可。
我必须这样做,因为我有一些自定义类型,所以我不能使用dump
。
代码如下:
safe_dump
我的产生输出的命令:
def represent_unicode(dumper, data):
return dumper.represent_scalar(u'tag:yaml.org,2002:str', data)
yaml.add_representer(unicode, represent_unicode)
python版本是2.7.5,PyYMAL是3.10。