【问题标题】:Suppress !!python/unicode in YAML output在 YAML 输出中抑制 !!python/unicode
【发布时间】:2016-09-21 09:36:01
【问题描述】:

当转储 (ruamel.yaml, PyYAML) dict data = {'abc': 'def'} 作为 Python 2.7 中的 YAML(使用 default_flow_style=False),您将获得:

abc: def

这很好。但是,如果您将所有字符串设为 unicode(通过 u 前缀或使用 from __future__ import unicode_literals),则会被转储为:

!!python/unicode 'abc': !!python/unicode 'def'

如何在不使用标签的情况下转储所有字符串(是否以 unicode 为前缀)而不恢复使用 safe_dump()?添加allow_unicode=True 并不能解决问题。

生成不需要的标签的完整示例:

from __future__ import unicode_literals

import sys
import ruamel.yaml

data = {'abc': 'def'}
ruamel.yaml.safe_dump(data, sys.stdout, allow_unicode=True, default_flow_style=False)

【问题讨论】:

    标签: python-2.7 yaml pyyaml ruamel.yaml


    【解决方案1】:

    您需要一个不同的代表来处理 unicodestr 的转换:

    from __future__ import unicode_literals
    
    import sys
    import ruamel.yaml
    
    def my_unicode_repr(self, data):
        return self.represent_str(data.encode('utf-8'))
    
    ruamel.yaml.representer.Representer.add_representer(unicode, my_unicode_repr)
    
    data = {'abc': u'def'}
    ruamel.yaml.dump(data, sys.stdout, allow_unicode=True, default_flow_style=False)
    

    给予:

    abc: def
    

    对于 PyYAML,这也可以,只需将 ruamel.yaml 替换为 yaml

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 2012-10-30
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      相关资源
      最近更新 更多