pyyaml正在产生不需要的!! python / unicode输出

时间:2013-12-03 13:43:17

标签: python pyyaml

我使用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

2 个答案:

答案 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的来源,发现Representerdump和{{ 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。