Python如何通过读取sys.argv输入高效生成多个JSON payload
解决方法
你需要的核心内置函数是zip(),它可以将多个可迭代对象按索引位置一一配对,刚好匹配你需要的「取每个列表相同索引元素组成一组」的需求。
你原有代码的核心问题有两个:
- 嵌套循环逻辑错误,会把每个列表的每个值依次覆盖三个字段,最终只会得到最后一组的最后一个值的错误结果
- 没有处理命令行参数里被shell保留的单引号,会导致生成的payload带多余符号
以下是修正后的完整代码:
import json import sys def prepare_payload(): with open("rabbitmq_payload.json") as fh: # 加载基础payload模板 base_payload = json.load(fh) return base_payload if __name__ == "__main__": # 解析命令行参数,去掉括号、多余单引号,拆分得到三个独立列表 billing_accounts = [s.strip("'") for s in sys.argv[1].strip('[]').split(',')] vcenter_urls = [s.strip("'") for s in sys.argv[2].strip('[]').split(',')] cred_headers = [s.strip("'") for s in sys.argv[3].strip('[]').split(',')] base_data = prepare_payload() all_payloads = [] # 用zip按索引配对三个列表的元素 for account, url, cred in zip(billing_accounts, vcenter_urls, cred_headers): # 每次复制模板生成新字典,避免修改同一个对象导致值覆盖 current_payload = base_data.copy() current_payload["billing_account_number"] = account current_payload["vcenter_url"] = url current_payload["cred_header"] = cred all_payloads.append(current_payload) # 直接打印符合预期格式的结果 print(json.dumps(current_payload, indent=4)) print() # 如果需要把所有payload写入文件,可开启以下代码 # with open("output_payloads.json", "w") as f: # json.dump(all_payloads, f, indent=4)
关键点说明
zip()是Python原生内置函数,无需额外安装依赖,三个输入列表长度一致的场景下,会依次返回(billing_accounts[0], vcenter_urls[0], cred_headers[0])、(billing_accounts[1], vcenter_urls[1], cred_headers[1])格式的元组,完全匹配你的需求- 每次赋值前调用
base_data.copy()是因为Python字典是可变对象,直接修改会覆盖上一次的赋值结果
内容的提问来源于stack exchange,提问作者kishore
相关产品推荐
相关产品推荐

