Excel转YAML时单引号异常转为三个,Ansible适配问题求助
解决PyYAML生成Ansible YAML时添加单引号的问题
你的问题根源在于PyYAML会自动处理字符串的引号逻辑:当你手动给字符串值包裹单引号(比如"'{}'".format(v)),这些单引号会被当成字符串内容的一部分,而非YAML的语法引号。PyYAML会根据内容自动转义或省略引号,导致出现'''value'''或无引号的异常输出。
下面是两种可靠的解决方法:
方法一:给特定值强制添加单引号
使用PyYAML的SingleQuotedScalarString类包装需要单引号的字符串,明确告诉PyYAML该值需要用单引号包裹:
from yaml.scalarstring import SingleQuotedScalarString import yaml # 替换你的变量生成逻辑 vars = {} for k, v in data.items(): # 用SingleQuotedScalarString包装值 vars.update({k: SingleQuotedScalarString(v)}) data = { 'all': { 'children': { 'fortigates': { 'hosts': { 'provisioning_ip': {}, }, 'vars': vars } } } } # 序列化输出 with open('output.yaml', 'w') as yaml_file: yaml.dump(data, yaml_file, default_flow_style=False, sort_keys=False)
这种方法只会给你指定的变量值添加单引号,其他字符串保持PyYAML的默认处理逻辑。
方法二:全局强制所有字符串使用单引号
如果你希望生成的YAML中所有字符串都用单引号包裹,可以自定义Dumper类,重写字符串的序列化逻辑:
import yaml class SingleQuoteDumper(yaml.Dumper): def represent_str(self, data): # 指定字符串用单引号包裹 return self.represent_scalar('tag:yaml.org,2002:str', data, style="'") vars = {} for k, v in data.items(): vars.update({k: v}) # 这里不需要手动加引号 data = { 'all': { 'children': { 'fortigates': { 'hosts': { 'provisioning_ip': {}, }, 'vars': vars } } } } # 序列化时使用自定义Dumper with open('output.yaml', 'w') as yaml_file: yaml.dump(data, yaml_file, default_flow_style=False, Dumper=SingleQuoteDumper, sort_keys=False)
注意事项
如果字符串本身包含单引号(比如it's),PyYAML会自动将其转义为两个单引号('it''s'),这是YAML的合法语法,Ansible可以正常解析。
内容的提问来源于stack exchange,提问作者EHMars
相关产品推荐
相关产品推荐

