转义字符和字符串

时间:2016-01-11 09:46:16

标签: python yaml unicode-escapes

我的功能如下:

def set_localrepo(self):

    stream = open("file1.yml", "r")
    results = yaml.load(stream)
    run_cmd = results["parameters"]["tag"]["properties"]
    config_list = ( 'sleep 200', '[sh, -xc, \"echo test\'  test\' >> /etc/hosts\"]')
    for i in range(len(config_list)):
        run_cmd.append(config_list[i])
    stream.close()
    with open("f2.yml", "w") as yaml_file:
        yaml_file.write(yaml.dump(results, default_flow_style=False, allow_unicode=True))
    yaml_file.close()    

在这个文件中,我有一个file1.yml骨架,从那里我处理并将列表中的内容写入f2.yml。

预期输出应如下所示:

        properties:
        - sleep 200 
        - [sh, -xc, "echo $repo_server'  repo-server' >> /etc/hosts"]

但它看起来像这样:

        properties:
        - sleep 200 
        - '[sh, -xc, "echo $repo_server''  repo-server'' >> /etc/hosts"]'

我尝试了多个组合,双\,单\等,但它的工作正如我想要的那样。

请告知可以采取哪些措施来解决此问题。我怀疑它与YAML转储实用程序和转义字符组合有关。

感谢您的期待!

2 个答案:

答案 0 :(得分:3)

根据您的预期输出,第二项不是字符串而是列表。因此,为了在Python中正确地序列化,这必须是一个列表(或元组)。这意味着您的config_list应如下所示:

( 'sleep 200', ['sh', '-xc', '"echo test\'  test\' >> /etc/hosts"'] )

此更改后,输出将为:

parameters:
  tags:
    properties:
    - sleep 200
    - - sh
      - -xc
      - '"echo test''  test'' >> /etc/hosts"'

因为您禁用了default_flow_style,所以您拥有相当于以下内容的奇怪嵌套列表:

parameters:
  tags:
    properties:
    - sleep 200
    - [sh, -xc, '"echo test''  test'' >> /etc/hosts"']

如果您担心单引号在YAML means one single quote only中是双引号在单引号字符串中。

附加。不要使用:

for i in range(len(config_list)):
  item = config_list[i]
  # ...

相反,使用更简单的迭代模式:

for item in config_list:
  # ...

答案 1 :(得分:1)

我不是YAML专家,但我认为这是预期的行为。

通过使用yaml.load重新加载YAML文件,您的程序的复制显示它已按预期正确重建了字符串:

import yaml

config_list = ( 'sleep 200', '[sh, -xc, "echo $test\'  test\' >> /etc/hosts"]')
results = {'properties': []}
run_cmd = results['properties']
for i in range(len(config_list)):
    run_cmd.append(config_list[i])

with open("f2.yml", "w") as yaml_file:
    yaml_file.write(yaml.dump(results, default_flow_style=False, allow_unicode=True))

yaml_file.close()

yaml_file2 = open('f2.yml', 'r')
data = yaml_file2.read()
print(yaml.load(data))

这会产生

的输出
{'properties': ['sleep 200', '[sh, -xc, "echo $test\'  test\' >> /etc/hosts"]']}

这正是您所期望的。使用外部的单引号和''内部必须是YAML在列表项中转义单引号的方式。