| 知乎专栏 |
import sys
import yaml
x = u"""\
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA6oySC+8/N9VNpk0gJS7Gk8vn9sYN7FhjpAQnoHRqTN/Oaiyx
xk2AleP2vXpojA/DHldT1JO+o3j56AHD+yfNFFeYvgWKDY35g49HsZZhbyCEAB45
...
"""
yaml.SafeDumper.org_represent_str = yaml.SafeDumper.represent_str
def repr_str(dumper, data):
if '\n' in data:
return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')
return dumper.org_represent_str(data)
yaml.add_representer(str, repr_str, Dumper=yaml.SafeDumper)
yaml.safe_dump(dict(a=1, b='hello world', c=x), sys.stdout)
print('-'*50)
class PSS(str):
pass
x = PSS("""\
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA6oySC+8/N9VNpk0gJS7Gk8vn9sYN7FhjpAQnoHRqTN/Oaiyx
xk2AleP2vXpojA/DHldT1JO+o3j56AHD+yfNFFeYvgWKDY35g49HsZZhbyCEAB45
...
""")
def pss_representer(dumper, data):
style = '|'
# if sys.versioninfo < (3,) and not isinstance(data, unicode):
# data = unicode(data, 'ascii')
tag = u'tag:yaml.org,2002:str'
return dumper.represent_scalar(tag, data, style=style)
yaml.add_representer(PSS, pss_representer, Dumper=yaml.SafeDumper)
yaml.safe_dump(dict(a=1, b='hello world', c=x), sys.stdout)
pip install ruamel.yaml
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import PreservedScalarString as pss
x = pss("""\
external_url 'https://gitlab.example.com'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.aliyun.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "netkiller@msn.com"
gitlab_rails['smtp_password'] = "******"
gitlab_rails['smtp_domain'] = "aliyun.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = 'netkiller@msn.com'
gitlab_rails['gitlab_shell_ssh_port'] = 22
""")
yaml = YAML()
yaml.dump(dict(a=1, b='hello world', c=x), sys.stdout)
输出结果
a: 1 b: hello world c: | external_url 'https://gitlab.example.com' gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.aliyun.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "netkiller@msn.com" gitlab_rails['smtp_password'] = "******" gitlab_rails['smtp_domain'] = "aliyun.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['gitlab_email_from'] = 'netkiller@msn.com' gitlab_rails['gitlab_shell_ssh_port'] = 22
from ruamel.yaml.scalarstring import LiteralScalarString, PreservedScalarString
from ruamel.yaml import YAML
import sys
yaml = YAML()
data = {}
data['data'] = PreservedScalarString("""\
0.0, 1.0
0.1, 1.5
0.2, 1.7
""")
data['data_points'] = LiteralScalarString("""\
0.0, 1.0
0.1, 1.5
0.2, 1.7""")
yaml.dump(data, sys.stdout)
print("=" * 50)
yaml_str = """\
any_value: 123.4
data_points: |2-
a
b
"""
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)