在 YAML 输出中抑制 !!python/unicode
Suppress !!python/unicode in YAML output
转储 (ruamel.yaml, PyYAML) 字典时 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'
如何在不恢复使用 safe_dump()
的情况下转储所有不带标签的字符串(是否有 unicode 前缀)?添加 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)
您需要一个不同的表示器来处理 unicode
到 str
的转换:
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
转储 (ruamel.yaml, PyYAML) 字典时 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'
如何在不恢复使用 safe_dump()
的情况下转储所有不带标签的字符串(是否有 unicode 前缀)?添加 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)
您需要一个不同的表示器来处理 unicode
到 str
的转换:
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