0
votes

Remplir un dictionnaire avec plusieurs entrées utilisateur

J'essaie de créer un dictionnaire qui stocke les données utilisateur pour créer un profil pour cet utilisateur. Mais chaque fois que j'exécute mon programme et que j'entre le mot d'échappement pour quitter l'exécution du programme, le programme n'imprime que les dernières informations entrées par l'utilisateur (le dernier profil à dire). Mais je veux pouvoir enregistrer et imprimer chaque profil comme si c'était son dictionnaire, donc il devrait être répertorié un dictionnaire imbriqué et enregistrer dans un fichier json mais je suis bloqué.

Voici mon code:

< pre> XXX

Et voici le message d'erreur que j'ai reçu dans le terminal: entrez la description de l'image ici


0 commentaires

3 Réponses :


0
votes

Si vous avez plus d'un objet json dans votre fichier, ce n'est plus valide, c'est pourquoi vous obtenez l'erreur. Vous devez ajouter votre date_profile à une liste et réécrire le fichier entier à chaque fois, ou avoir un fichier par profil.


0 commentaires

0
votes

Votre fichier JSON n'est pas valide. Vous pouvez utiliser un validateur pour le valider. Une solution rapide serait de les stocker dans un tableau et de les vider une fois.

[
{profile_1},
{profile_2},
{profile_3}
]

Une alternative aux données persistantes serait Pickle .

Bien que je vous recommande d'utiliser une base de données pour stocker vos données.


0 commentaires

0
votes

Quelques éléments:

Vous pouvez enregistrer du code en créant un dictionnaire avec les clés déjà renseignées, puis en parcourant simplement les clés pour inviter l'utilisateur.

La façon dont vous videz votre json n'est pas correcte. Je suis surpris qu'il soit en train de le relire. La structure json de niveau supérieur pour votre fichier devrait être une liste. À l'intérieur de la liste se trouve une collection de dictionnaires de profil utilisateur. Lors de l'ajout d'un nouveau dictionnaire, vous devrez lire le contenu du fichier, ajouter le nouveau dict, puis réécrire le fichier entier à nouveau.

Il est utile à long terme de diviser les tâches séparées en fonctions individuelles . Cela facilite la gestion du code.

python collect.py

Pour l'exécuter, enregistrez-le dans un fichier python, tel que collect.py et exécutez:

import os
import json

def collect_data():
    """Collect user input to build a dating profile and store it in a
    dictionary """
    date_profile = {
        'first_name' : '',
        'surname': '',
        'gender': '',
        'age': '',
        'location': ''
    }

    validations = {
        'first_name' : (None, None),
        'surname': (None, None),
        'gender': (validate_gender, 'Please select either "male" or "female".'),
        'age': (int, 'Age must be an integer.'),
        'location': (None, None)
    }

    for key in date_profile:
        value = query_user(key)
        if value is None:
            return
        validate, msg = validations.get(key)
        if validate:
            retry = True
            while retry: 
                try:
                    validate(value)
                    retry = False
                except:
                    print(msg)
                    value = query_user(key)
                    if value is None:
                        return
        date_profile[key] = value
    return date_profile

def export_profile(file_path, date_profile):
    # read in json, or create new list
    if os.path.exists(file_path):
        with open(file_path) as fp:
            j_data = json.load(fp)
    else:
        j_data = []
    j_data.append(data_profile)
    # write out
    with open(file_path, 'w') as fp:
        json.dump(j_data, fp)

def query_user(key):
    query = "Enter your {} (type 'quit' to exit): ".format(key.replace('_', ' '))
    value = input(query)
    if value.lower() == 'quit':
        print('Exiting.')
        return None
    return value

def validate_gender(g):
    assert g.lower() in ('male', 'female')

if __name__ == '__main__':
    dp = collect_data()
    export_profile("dating_profile.json", dp)


2 commentaires

Je voulais aussi demander. Dans la première déclaration d'exception, vous avez écrit à quoi sert l'exception?


Aucun problème. S'il répond à votre question, veuillez cliquer sur la coche à côté de la réponse. Le bloc except interceptera toute exception venant d'essayer de valider l'entrée de données. Vous pouvez l'écrire sous la forme de deux blocs sauf, un pour ValueError et un autre pour AssertionError , mais le code dans les blocs serait le même.