Как добавить словарь в список, не перекрывая json выходящего словаря

#python #json #forms #dictionary #flask

Вопрос:

Я пишу код с помощью 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, затем добавить существующие словари в список пользователей, а затем добавить входные данные из формы, а затем сбросить новый список в файл 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, — это список со списком элементов в виде словарей, например: [{},{},{},{}]

Есть идеи, как это исправить?

Комментарии:

1. Содержит users.json только а dict на верхнем уровне или это а list ?

Ответ №1:

 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)
 

Комментарии:

1. здесь я получаю этот код ошибки с debug=True на: json.decoder.JSONDecodeError: Ожидаемое значение: строка 1 столбец 1 (символ 0)

2. Начните с users.json содержания только []

3. Нииииисе! Теперь это работает!

Ответ №2:

Вам нужны load данные из json файла.

 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 -это а, и если нет, сделайте это так.

 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
 

Комментарии:

1. это работает, но это просто создает список рядом со списком, вот так: [{},{},{}][{},{},{}][{},{},{}]

2. я получаю сообщение об ошибке, в котором говорится, что проблема в следующем: users_list = json.load(файл) # Это должна быть ваша сохраненная структура json

3. Это произойдет, если то, что в вашем файле, недействительно json . Вы могли бы начать с [] того, что предложил @Woodford.