簡體   English   中英

有沒有一種有效的方法可以使用 Python 中的字典將數據寫入 JSON 文件?

[英]Is there an efficient way to write data to a JSON file using a dictionary in Python?

我正在用 Python 編寫一個程序來使用一個 API,該 API 需要以一種真正特定的方式從 JSON 有效負載獲取輸入,如下所示。 poid 元素將在程序的每次運行中包含不同的數字,inventories 元素包含我嘗試發送到 API 的字典列表。

[
    {   
        "poid":"22130",
        "inventories": 
        [        
            {       
                "item": "SAMPLE-ITEM-1",
                "mfgr": "SAMPLE-MANUFACTURER-1",
                "quantity": "1",
                "condition": "REF"
            },
            {       
                "item": "SAMPLE-ITEM-2",
                "mfgr": "SAMPLE-MANUFACTURER-2",
                "quantity": "3",
                "condition": "REF"
            }
        ]   
    }
]

我需要放入文件中的數據存儲在字典和列表中,如下所示。 為了這篇文章的簡單起見,我展示了字典和列表在另一種方法創建它們之后的樣子。 當我不得不將數據寫入 JSON 時,我不確定這是否是存儲這些數據的最有效方式。

pn_and_mfgr_dict = {'SAMPLE-ITEM-1': 'SAMPLE-MANUFACTURER-1', 'SAMPLE-ITEM-2': 'SAMPLE-MANUFACTURER-2'}
quantities = ["1","3"] 
poid = 22130 #this will be different each run

如果我上面寫的內容有意義,我需要根據第二個代碼塊的信息生成一個看起來像第一個代碼塊的 JSON 文件。 數量列表中索引為 0 的項目對應於字典中的第一個鍵/值對,依此類推。 第一個代碼塊中的“條件”值將始終以“REF”作為我使用的值,但我還需要將其包含在發送到 API 的最終負載中。 由於每次運行時部件號和制造商字典的長度都不同,因此無論字典中有多少個值,我都需要使用此方法。 不過,該詞典和數量列表的長度始終相同。 我認為我能解決這個問題的最好方法是制作一個循環遍歷字典並將相應的數據放在需要的地方,然后在循環完成后讀取文件並將其作為有效負載發送但請糾正我如果有一種更好的方法可以做到這一點,比如將所有內容都存儲在變量中。 我也沒有使用 JSON 的經驗,所以我嘗試使用 JSON 庫來完成此操作,但不知道我做錯了什么。 我今晚可以嘗試編輯它,但我想盡快發布它。

這是一種可能的解決方案:

import json

pn_and_mfgr_dict = {
    'SAMPLE-ITEM-1': 'SAMPLE-MANUFACTURER-1',
    'SAMPLE-ITEM-2': 'SAMPLE-MANUFACTURER-2'
}

quantities = ['1', '3'] 

poid = 22130

payload = {
    'poid': poid, 
    'inventories': [{
        'item': item,
        'mfgr': mfgr,
        'quantity': quantity,
        'condition': 'REF'
      } for (item, mfgr), quantity in zip(pn_and_mfgr_dict.items(), quantities)]
}

print(json.dumps(payload, indent=2))

上面的代碼將導致:

{
  "poid": 22130,
  "inventories": [
    {
      "item": "SAMPLE-ITEM-1",
      "mfgr": "SAMPLE-MANUFACTURER-1",
      "quantity": "1",
      "condition": "REF"
    },
    {
      "item": "SAMPLE-ITEM-2",
      "mfgr": "SAMPLE-MANUFACTURER-2",
      "quantity": "3",
      "condition": "REF"
    }
  ]
}

自然地,您可以使用如下方式針對多個poids進行調整:

poids = [22130, 22131, 22132]

for poid in poids:
    # implement here the logic to get items and quantities for
    # each poid

    payload = {
        'poid': poid,
        'inventories': [{
            'item': item,
            'mfgr': mfgr,
            'quantity': quantity,
            'condition': 'REF'
          } for (item, mfgr), quantity in zip(pn_and_mfgr_dict.items(), quantities)]
    }

    print(json.dumps(payload, indent=2))

您將需要對其進行更改,使每個poid具有相應的項目和數量,我將其作為您實施的起點。

您的第二個塊是您的輸入,因此您可以立即開始寫下一個接受這些輸入並返回 JSON 字符串的函數。

import json
from typing import Dict, List


def jsonify_data(pn_and_mfgr_dict: Dict, quantities: List, poid: int):
    constructed_data = []  # TODO
    return json.dumps(constructed_data)

然后您可以開始使用輸入來構建您想要的輸出數據。 而且您已經知道該怎么做。

我認為我能解決這個問題的最好方法是制作一個循環遍歷字典並將相應的數據放在需要的地方

是的,這就是這樣做的方法。

這是我的解決方案版本:

import json
from typing import Dict, List


def jsonify_data(pn_and_mfgr_dict: Dict, quantities: List, poid: int):
    inventories = [
        {
            'item': item,
            'mfgr': mfgr,
            'quantity': quantity,
            'condition': 'REF',
        } for (item, mfgr), quantity in zip(pn_and_mfgr_dict.items(), quantities)
    ]
    constructed_data = [
        {
            'poid': f'{poid}',
            'inventories': inventories,
        }
    ]
    return json.dumps(constructed_data)
import json

data = {'inventories': [{'SAMPLE-ITEM-1': 'SAMPLE-MANUFACTURER-1'}, {'SAMPLE-ITEM-2': 'SAMPLE-MANUFACTURER-2'}]}
quantities = ["1", "3"]
poid = 22130

# Add poid to data
data['poid'] = poid

# Add quantities to data
for item in data['inventories']:
    item['quantity'] = quantities.pop(0)

# Serializing json
json_object = json.dumps(data, indent=4)
print(json_object)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM