我正在使用Python迁移我们的GitHub操作工作流.

Select ruamel.yaml而不是pyYaml,因为在这里我至少可以 Select 保留引号.

现在,它看起来是这样的:

 - {uses: actions/checkout@v3}

原文是这样的:

 - uses: actions/checkout@v3

不过,这并不一致.有时会保留原始格式(不带大括号).

有什么方法可以避免使用大括号进行格式化吗?

当我们这样做的时候:

run: |
  sed -i "/$IMAGE_NAME_FRONTEND@sha256/c frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND" it/k8s/admin/values.yaml

有没有可能以某种方式保留这种格式?因为现在它是这样做的:

 - {name: Register RepoDigests, run: "sed -i \"/$IMAGE_NAME_FRONTEND@sha256/c\ frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND\" it/k8s/admin/values.yaml\n",

我的意思是,有没有办法为多行字符串保留|

推荐答案

您的代码信息量不是很大,因此很难看到您在做什么(或者可能做错了).默认情况下为ruamel.yaml 但是,往返模式将保留流样式/块样式以及块文字样式标量(由|引入):

import sys
import ruamel.yaml

yaml_str = """\
abc:
 - {uses: actions/checkout@v3}
 - uses: actions/checkout@v3
 - name: Register RepoDigests
   run: |
     sed -i "/$IMAGE_NAME_FRONTEND@sha256/c frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND" it/k8s/admin/values.yaml
"""
    
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

这提供了:

abc:
- {uses: actions/checkout@v3}
- uses: actions/checkout@v3
- name: Register RepoDigests
  run: |
    sed -i "/$IMAGE_NAME_FRONTEND@sha256/c frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND" it/k8s/admin/values.yaml

如果加到data,则默认情况下将采用块样式(即不带大括号),除非您这样做了

yaml.default_flow_style = None  # or True

您可以更改键run的值(即sed命令行),但您必须小心.那 Value打印起来像一个字符串,行为也像一个字符串,例如你可以做一个.replace().但它 不是一个普通的Python字符串,而是一个ruamel.yaml.scalarstring.LiteralStyleScalar,其类型 信息是用来将整个事物再次作为字面样式标量转储的东西.所以 如果为键run指定新值,则可能需要"保留"该类型:

data = yaml.load(yaml_str)
data['abc'].append(dict(extra='read all about it'))
x = ruamel.yaml.comments.CommentedMap(some='more')
x.fa.set_flow_style()  # fa for FlowAttribute
rundata = data['abc'][2]
lit_style = type(rundata['run'])
rundata['run'] = rundata['run'].replace('sha256', 'sha512')
rundata['post'] = lit_style('rm -f *.junk')
data['abc'].append(x)

yaml.dump(data, sys.stdout)

这提供了:

abc:
- {uses: actions/checkout@v3}
- uses: actions/checkout@v3
- name: Register RepoDigests
  run: |
    sed -i "/$IMAGE_NAME_FRONTEND@sha512/c frontendImage: $IMAGE_NAME_FRONTEND@$IMAGE_DIGEST_FRONTEND" it/k8s/admin/values.yaml
  post: |-
    rm -f *.junk
- extra: read all about it
- {some: more}

Python相关问答推荐

如何用symy更新分段函数

用gekko解决的ADE方程系统突然不再工作,错误消息异常:@错误:模型文件未找到.& &

将整组数组拆分为最小值与最大值之和的子数组

根据另一列中的nan重置值后重新加权Pandas列

大小为M的第N位_计数(或人口计数)的公式

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

PyQt5,如何使每个对象的 colored颜色 不同?'

SQLAlchemy Like ALL ORM analog

如何在Python中使用另一个数据框更改列值(列表)

基于行条件计算(pandas)

如何杀死一个进程,我的Python可执行文件以sudo启动?

将标签移动到matplotlib饼图中楔形块的开始处

如何过滤组s最大和最小行使用`transform`'

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

一个telegram 机器人应该发送一个测验如何做?""

如何在信号的FFT中获得正确的频率幅值

多个矩阵的张量积

Python如何导入类的实例

比较两个有条件的数据帧并删除所有不合格的数据帧

分解polars DataFrame列而不重复其他列值