Python脚本提取Dockerfile中LABEL内容写入YAML时如何避免生成额外引号
这个问题是因为PyYAML在处理包含特殊字符(像双引号、单引号、等号)的字符串时,会自动添加外层引号并转义内部的引号,以此保证生成的YAML语法合法,但这和你想要的原样输出需求冲突了。
给你两个解决方案,其中第一个最简单直接,完全符合你的预期:
方案1:手动生成YAML内容(推荐)
既然你只是要把提取的LABEL内容原样作为YAML列表项,不需要PyYAML做复杂的类型转换,直接手动写入文件就可以避免自动转义的问题:
#!/usr/bin/python3 def _extract_dockerfile_labels(): labels = [] with open("testing/dockerfile") as dockerfile: for line in dockerfile.readlines(): stripped_line = line.strip() if stripped_line.startswith('LABEL'): # 精准去除LABEL前缀及后续空格,保留剩余内容 label_val = stripped_line[len('LABEL'):].lstrip() labels.append(label_val) with open("output.yml", "w+") as out_file: # 手动构建YAML列表格式,原样写入每个标签 for label in labels: out_file.write(f"- {label}\n") _extract_dockerfile_labels()
这个修改做了几点优化:
- 用
strip()处理每行,避免行首空格干扰LABEL的判断(比如Dockerfile里LABEL前面有缩进的情况) - 用
stripped_line[len('LABEL'):].lstrip()替代replace,更精准地移除LABEL前缀,不会误删行内其他位置的LABEL字符串 - 直接遍历列表写入每行,完全保留原始字符串的格式,没有额外引号或转义
方案2:使用PyYAML的字面量字符串类型(适合需要复杂YAML结构的场景)
如果你需要保留yaml.dump的用法(比如后续要添加更多YAML结构),可以使用PyYAML的LiteralScalarString来标记字符串,让PyYAML原样输出:
#!/usr/bin/python3 import yaml from yaml.scalarstring import LiteralScalarString def _extract_dockerfile_labels(): labels = [] with open("testing/dockerfile") as dockerfile: for line in dockerfile.readlines(): stripped_line = line.strip() if stripped_line.startswith('LABEL'): label_val = stripped_line[len('LABEL'):].lstrip() # 将字符串标记为字面量,避免自动转义 labels.append(LiteralScalarString(label_val)) with open("output.yml", "w+") as out_file: yaml.dump(labels, out_file, default_flow_style=False, allow_unicode=True)
不过注意这个方案会生成块样式的YAML(字符串前加|),如果需要行内格式,方案1更合适。
内容的提问来源于stack exchange,提问作者Bennie
相关产品推荐
相关产品推荐

