知乎专栏 |
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)