You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 02:49:09