Python脚本转换CSV为Azure DevOps Pipeline YAML的问题求助
解决CSV转Azure DevOps Pipeline YAML的脚本问题
现有Python转换脚本
import csv import yaml in_file = open(r'C:\Users\246742\Desktop\Book2.csv', "r") out_file = open('yaml_file.yaml', "w") items = [] def convert_to_yaml(line, counter): item = { 'task': line[0], 'displayName': line[1], 'inputs': { 'ConnectedServiceName' : line[2], 'Action' :line[3], 'KeyVaultName' :line[4], 'SecretName' :line[5], 'Secret':line[6], 'VariableName':line[7], 'Overwrite' : line[8] } } items.append(item) try: reader = csv.reader(in_file) next(reader) # skip headers for counter, line in enumerate(reader): convert_to_yaml(line, counter) out_file.write( yaml.dump(items, default_flow_style=False) ) finally: in_file.close() out_file.close()
当前生成的YAML输出
- displayName: 'Azure Key Vault: SetSecret adf-bookings' inputs: Action: abc_QA_SPN ConnectedServiceName: abc_QA_SPN KeyVaultName: SetSecret Overwrite: adf-booking Secret: adf-booking SecretName: $(QAkvabc) VariableName: $(booking) task: maikvandergaag.maikvandergaag-azurekeyvault.azurekeyvault.azurekeyvaultactions@2 - displayName: 'Azure Key Vault: SetSecret adf-booking' inputs: Action: abc_QA_SPN ConnectedServiceName: abc_QA_SPN KeyVaultName: SetSecret Overwrite: adf-booking Secret: adf-booking SecretName: $(QAkvabc) VariableName: $(booking) task: maikvandergaag.maikvandergaag-azurekeyvault.azurekeyvault.azurekeyvaultactions@2
期望的Azure DevOps Pipeline YAML输出
trigger: - none variables: - group: Devportal pool: name: Ubuntu 20.04 steps: - task: maikvandergaag.maikvandergaag-azurekeyvault.azurekeyvault.azurekeyvaultactions@2 displayName: 'Azure Key Vault: SetSecret adf-bookings' inputs: ConnectedServiceName: 'abc_QA_SPN' Action: SetSecret KeyVaultName: '$(QAkvabc)' SecretName: 'booking' Secret: '$(booking)' VariableName: 'booking' Overwrite: false - task: maikvandergaag.maikvandergaag-azurekeyvault.azurekeyvault.azurekeyvaultactions@2 displayName: 'Azure Key Vault: SetSecret adf-bookings' inputs: ConnectedServiceName: 'abc_QA_SPN' Action: SetSecret KeyVaultName: '$(QAkvabc)' SecretName: 'booking' Secret: '$(booking)' VariableName: 'booking' Overwrite: false
当前存在的问题
- 字典键按字母排序,无法保持指定的顺序(比如
task应该在displayName之前) - 输出值未自动添加引号,不符合期望格式
- 缺少Azure DevOps Pipeline必需的固定结构:
trigger、variables、pool
修改后的Python脚本
import csv import yaml from collections import OrderedDict # 定义Pipeline固定结构 pipeline_structure = OrderedDict([ ('trigger', ['none']), ('variables', [OrderedDict([('group', 'Devportal')])]), ('pool', OrderedDict([('name', 'Ubuntu 20.04')])), ('steps', []) ]) def convert_to_yaml(line): # 用OrderedDict保持键的顺序 task_item = OrderedDict([ ('task', line[0]), ('displayName', line[1]), ('inputs', OrderedDict([ ('ConnectedServiceName', line[2]), ('Action', line[3]), ('KeyVaultName', line[4]), ('SecretName', line[5]), ('Secret', line[6]), ('VariableName', line[7]), ('Overwrite', line[8].lower() == 'true') # 转换为布尔值 ])) ]) return task_item try: with open(r'C:\Users\246742\Desktop\Book2.csv', "r") as in_file, open('yaml_file.yaml', "w") as out_file: reader = csv.reader(in_file) next(reader) # 跳过表头 for line in reader: pipeline_structure['steps'].append(convert_to_yaml(line)) # 使用yaml.dump时指定sort_keys=False保持顺序,default_style='"'给字符串加引号 yaml.dump(pipeline_structure, out_file, default_flow_style=False, sort_keys=False, default_style='"') except Exception as e: print(f"转换出错: {e}")
修改说明
- 保持键顺序:使用
collections.OrderedDict定义字典,同时在yaml.dump中设置sort_keys=False,确保输出的键顺序与定义一致 - 添加引号:在
yaml.dump中设置default_style='"',让所有字符串值自动添加双引号 - 添加固定结构:预先定义
trigger、variables、pool等Pipeline必需的结构,将转换后的task步骤添加到steps列表中 - 类型转换:将
Overwrite字段转换为布尔值(根据CSV中的值自动转为true/false) - 文件操作优化:使用
with语句自动管理文件的打开和关闭,避免手动关闭可能出现的问题
内容的提问来源于stack exchange,提问作者JohnB
相关产品推荐
相关产品推荐

