我的功能如下:
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转储实用程序和转义字符组合有关。
感谢您的期待!
答案 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在列表项中转义单引号的方式。