Python转换列表文本为Terraform HCL格式时引号错误求助
解决Python转换文本到Terraform HCL格式的字符拆分错误问题
问题背景
需要将input.txt中的键值对格式转换为Terraform所需的HCL列表格式,要求每个列表元素包裹双引号,但当前运行Python代码后,生成的output.txt中出现了每个字符被单独加双引号的错误。
输入输出示例
输入文件input.txt
spn-owner-adm = owner, reader, admin, net-admin, str-admin, viewer spn-net-adm = admin, net-admin, str-admin spn-str-adm = str-admin, viewer, compute-admin, viewer, reader spn-my-adm = owner, admin, viewer, reader
预期输出output.txt
spn-owner-adm = [ "owner", "reader", "admin", "net-admin", "str-admin", "viewer" ] spn-net-adm = [ "admin", "net-admin", "str-admin" ] spn-str-adm = [ "str-admin", "viewer", "compute-admin", "viewer", "reader" ] spn-my-adm = [ "owner", "admin", "viewer", "reader" ]
实际错误输出
spn-owner-adm = [" ""o""w""n""e""r""," " "r""e""a""d""e""r""," " "a""d""m""i""n""," " "n""e""t""-""a""d""m""i""n""," " "s""t""r""-""a""d""m""i""n""," " "v""i""e""w""e""r" ] spn-net-adm = [" ""a""d""m""i""n""," " "n""e""t""-""a""d""m""i""n""," " "s""t""r""-""a""d""m""i""n" ] spn-str-adm = [" "" ""s""t""r""-""a""d""m""i""n""," " "v""i""e""w""e""r""," " "c""o""m""p""u""t""e""-""a""d""m""i""n""," " "v""i""e""w""e""r""," " "r""e""a""d""e""r" ] spn-my-adm = [" ""o""w""n""e""r""," " "a""d""m""i""n""," " "v""i""e""w""e""r""," " "r""e""a""d""e""r" ]
错误原因分析
原代码中,spnrglist是按等号拆分后的字符串,直接遍历该字符串会把每个字符当作独立元素处理,导致每个字符被包裹双引号。正确的做法应该是先将字符串按逗号分割为元素列表,再处理每个元素的空格并添加双引号。
修复后的Python代码
#!/usr/bin/env python3 import re myspn_pattn = r"^spn-.*-adm.*$" myfile = "input.txt" with open(myfile, 'r') as fsp, open('output.txt', 'w+') as fspn: fspn.write("spn = {" "\n\n") for myspn in fsp: # 匹配目标行,同时去除首尾换行符 myspn_stripped = myspn.strip() spnmatch = re.findall(myspn_pattn, myspn_stripped) if spnmatch: line = spnmatch[0] # 拆分键和值部分,处理可能的多空格 spnname, spnrglist_str = [part.strip() for part in line.split('=', 1)] # 按逗号拆分值,去除每个元素的空格,过滤空元素 spnrglist = [item.strip() for item in spnrglist_str.split(',') if item.strip()] # 给每个元素添加双引号,并用逗号+空格连接 formatted_list = ', '.join([f'"{item}"' for item in spnrglist]) # 拼接成HCL格式的行 spnup = f"{spnname} = [ {formatted_list} ]\n" fspn.write(spnup) fspn.write("\n") fspn.write("\t" "}")
修复后验证结果
运行修复后的代码,生成的output.txt将完全符合预期的HCL列表格式,每个元素正确包裹双引号,无字符拆分错误。
内容的提问来源于stack exchange,提问作者sai_2121
相关产品推荐
相关产品推荐

