簡體   English   中英

如何在不與現有字典 json 重疊的情況下將字典附加到列表中

[英]How do i get a dictionary appended into a list without overlapping the exitsting dictionary json

我用 Python、JSON 和 Flask 編寫代碼我做了一個函數“make_user():”來從我的表單中獲取數據並將其插入到字典中:

users_list = []
@app.route("/makeuser", methods=["post"])
def make_user():
    firstname = f.request.form["firstname"]
    lastname = f.request.form["lastname"]
    username = f.request.form["username"]
    password = f.request.form["pwd"]
    mail = f.request.form["email"]
    car = f.request.form["car"]

    res = {
        "firstname" : firstname,
        "lastname" : lastname,
        "username" : username,
        "password" : password,
        "mail" : mail,
        "car" : car
    }

麻煩來了,當我嘗試打開我的 json 文件時,然后將現有字典添加到 users_list,然后附加表單中的輸入,然后將新列表轉儲到 json 文件中。 這是我的嘗試:

file = open("users.json", "r+")
users_list.append(file)

for list_item in users_list:
    users_list.append(res)

json.dump(users_list,file)
file.close

return redirect(url_for("form"))

我想在 json 文件中包含一個列表,其中包含列表項作為字典,如下所示:[{},{},{},{}]

我如何解決這個問題的任何想法?

您需要從json文件load數據。

with open("users.json", "r") as file:
    try:
        users_list = json.load(file) # This should be your saved json structure
    except json.decoder.JSONDecodeError: # in case your file does not contain valid json or is empty
        users_list = []
if isinstance(users_list, dict): # this can be removed if your top level is a list
    users_list = [users_list]
users_list.append(res) # append to the existing list
with open("users.json", "w") as file:
    json.dump(users_list, file) # dump back to file

假設這就是您的文件中的內容。

{
    "firstname" : "Martin",
    "lastname" : "Mouse",
    "username" : "mmouse",
    "password" : "hunter9",
    "mail" : "mmouse@dasney.com",
    "car" : "Lambo"
}

json模塊有一個方便的功能,可以從數據中讀取您的文件,並一步將其解析為 Python 對象。

users_list = json.load(file)

這基本上是在說:

user_list = {
    "firstname" : "Martin",
    "lastname" : "Mouse",
    "username" : "mmouse",
    "password" : "hunter9",
    "mail" : "mmouse@dasney.com",
    "car" : "Lambo"
}

下一步是確保您的頂級是一個list ,如果不是,則將其list

if isinstance(users_list, dict):
    users_list = [users_list]

所以現在你的結構看起來像這樣。

[
    {
        "firstname" : "Martin",
        "lastname" : "Mouse",
        "username" : "mmouse",
        "password" : "hunter9",
        "mail" : "mmouse@dasney.com",
        "car" : "Lambo"
    }
]

此時,您可以附加新條目。

users_list.append(res)

現在是這個。

[
    {
        "firstname" : "Martin",
        "lastname" : "Mouse",
        "username" : "mmouse",
        "password" : "hunter9",
        "mail" : "mmouse@dasney.com",
        "car" : "Lambo"
    },
    {
        "firstname" : "Darnold",
        "lastname" : "Duck",
        "username" : "dduck",
        "password" : "hunter10",
        "mail" : "dduck@dasney.com",
        "car" : "Ferrari"
    }

]

最后,轉儲回文件。

with open("users.json", "w") as file:
    json.dump(users_list, file) # dump back to file
file = open("users.json", "r+")
users_list.append(file)

此處的file不包含users.json的內容。 它是一個打開文件的“句柄”,您可以從中讀取數據——或傳遞給json.load

for list_item in users_list:
    users_list.append(res)

這一點是無稽之談。 假設您正確加載了users.json的內容,這會將res附加到每個元素。 這不僅不是您想要的,而且不可能,因為每個元素都是一個字典。

由於您要替換文件的內容,因此您需要將其打開兩次; 一次閱讀,一次寫作。 您不能附加到文件,因為這會破壞結構化的 JSON。 嘗試這樣的事情:

with open("users.json") as file:
    users_list = json.load(file)

users_list.append(res)

with open("users.json", "w") as file:
    json.dump(users_list, file)

暫無
暫無

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

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