【问题标题】:How can i create multiple json payload efficiently by reading input from sys.argv in python如何通过从 python 中的 sys.argv 读取输入来有效地创建多个 json 有效负载
【发布时间】:2021-12-17 11:43:50
【问题描述】:

问题陈述:

这就是我调用 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 程序员!

【问题讨论】:

    标签: python json list dictionary list-manipulation


    【解决方案1】:

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

    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 个列表的长度相同。如果不能保证,那么您需要遍历最长的列表并将缺失值设置为空字符串。

    【讨论】:

    • 谢谢@Tyler 这仅在 sys.argv 传入引号中的情况下才有效,如在 str 中。我打算将 sys.argv 修改为 input() 以便用户可以轻松运行脚本。
    【解决方案2】:

    (您似乎在问不同的问题。如何更好地使用 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)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2015-01-16
      • 2019-10-17
      • 2011-01-30
      相关资源
      最近更新 更多