我如何通过读取 python 中 sys.argv 的输入来有效地创建多个 json 有效负载

How can i create multiple json payload efficiently by reading input from sys.argv in python

问题陈述:

这就是我调用 prepare_payload.py ,

的方式
python3 prepare_payload.py ['Test_B1','Test_B2','Test_B3'] [https://10.5.5.1,https://10.5.5.2,https://10.5.5.3] ['abc','efg','sss']

我正在尝试准备的 json 负载:

{
    "billing_account_number": "",
    "vcenter_url": "",
    "cred_header": "",
}

预期输出:

{
    "billing_account_number": "Test_B1",
    "vcenter_url": "https://10.5.5.1",
    "cred_header": "abc",
}

{
    "billing_account_number": "Test_B2",
    "vcenter_url": "https://10.5.5.2",
    "cred_header": "efg",
}
{
    "billing_account_number": "Test_B3",
    "vcenter_url": "https://10.5.5.3",
    "cred_header": "sss",
}

我的代码:

import json
import os
import sys

master_list = []
billing_account_number = sys.argv[1]
ip_addr = sys.argv[2]
cred_header = sys.argv[3]
res = list(map(str, billing_account_number.strip('[]').split(',')))
ip = list(map(str, ip_addr.strip('[]').split(',')))
cred_headers = list(map(str, cred_header.strip('[]').split(',')))
master_list.append(res)
master_list.append(ip)
master_list.append(cred_headers)
def prepare_payload():
    with open("rabbitmq_payload.json") as fh:
        data = json.load(fh)
    print('================================================')
    return data
data = prepare_payload()
for i in master_list:
    for j in i:
        data['billing_account_number'] = j
        data['vcenter_url'] = j
        data['cred_header'] = j
        
print(data)

我不知道是否必须将这些单独的列表(如 res、IP、cred_headers 合并到一个列表中,然后像主列表一样迭代 [res[0]、IP[0] ,cred_headers[0]] 然后开始替换我的数据字典中的键值对? 如果有任何我可以依赖的内置功能或任何有效的方法来解决这个问题,请帮助我。预先感谢所有出色的 python 程序员!

将列表作为命令行参数传入有点不方便。最好使用标准输入,但尽管如此,请看一下这段代码:

import sys
import ast

billing_account_number = ast.literal_eval(sys.argv[1])
ip_addr = ast.literal_eval(sys.argv[2])
cred_header = ast.literal_eval(sys.argv[3])
output = []
for i in range(len(billing_account_number)):
    output.append({"billing_account_number": billing_account_number[i], "ip_addr": ip_addr[i], "cred_header": cred_header[i]})
print(output)

输出:

[{'billing_account_number': 'Test_B1', 'ip_addr': 'https://10.5.5.1', 'cred_header': 'abc'}, {'billing_account_number': 'Test_B2', 'ip_addr': 'https://10.5.5.2', 'cred_header': 'efg'}, {'billing_account_number': 'Test_B3', 'ip_addr': 'https://10.5.5.3', 'cred_header': 'sss'}]

您需要将命令行参数括在引号中,以便正确解析。此外,此代码假定所有 3 个列表的长度相同。如果不能保证,那么您将需要遍历最长的列表并将缺失值设置为空字符串。

(看来你在问不同的问题。如何更好地使用 argv 与如何合并列表不同。这是针对你文本中的问题。也很难说出你要做什么用你的文件。)

您有 3 个列表中的内容要合并并转换为字典。

合并列表的内置方式是zip()

zip(res, ips, cred_headers)

有多种方法可以将其转换为字典。一个是列表理解:

result = [{
    "billing_account_number": res_item,
    "ip_addr": ips_item,
    "cred_header": cred_item,
} for res_item, ips_item, cred_item in zip(res, ips, cred_headers)]