29

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

4

2 回答 2

49

我尝试了许多组合,我能找到的唯一一种能够始终产生正确 YAML 输出的组合是:

yaml.safe_dump(data, file(filename,'w'), encoding='utf-8', allow_unicode=True)
于 2013-12-04T07:57:40.297 回答
1

受到safe_dump可以产生预期结果的公认答案的启发,我检查了 的来源python2.7/site-packages/yaml/representer.py,发现Representerfordumpsafe_dump使用不同的表示函数 for 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)

我产生输出的命令:

yaml.dump(yml, encoding='utf-8', allow_unicode=True, default_flow_style=False, explicit_start=True)

python版本是2.7.5,PyYMAL是3.10。

于 2020-06-05T03:16:08.810 回答