Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/02/2021, à 10:00

chris7522

[RESOLU] Utilisation format JSON (python)

Bonjour a toutes et a tous ,
  J'ai écris ce petit truc , comment pourrai je améliorer ce code ?  Ca ne doit pas etre tres propre tout ca .
  Merci de votre analyse

import json

def nouveau_client():
    print("choisissez un mot de passe d'au moins 5 caracteres alphanumérique :")
    while True:
        password = input()
        if len(password) < 5:
            print('Entrez un mot de passe de plus de 5 caractere :')
        else:
            print('mot de passe correcte')
            break
    print('Voici votre mot de passe :',password)
    dic = {}
    dic["password"] = password
    
    print('Entrez votre prenom :')
    while True:
        name = input()
        if(isinstance(name,str)):
            print('prenom sauvegardé')
            break    
        else:
            print('Entrez une chaine')
    dic["prenom"] = name  
    sauvegarde(dic)
    
def sauvegarde(client):
    with open("client.json","w")as f:
        json.dump(client,f)    
    
       
def verif():
    with open("client.json","r")as f:
        dic = {}
        dic = json.load(f)
    var1 = dic.get("password","cle absente")
    print("Entrez votre mot de passe : ")
    while True:
        var2 = input()
        if var1 == var2:
            print("Mot de passe correcte")
            break
        else:
            print("Mot de passe incorrecte,recommencer..")
    var3 = dic.get("prenom","cle absente")
    print(f"Bienvenue {var3.upper()}")
    
   
       
print("Bonjour , Bienvenue !")
print("Vous etes déja client ? Tapez 1")
print("Vous etes nouveau client ? tapez 2 ")
var = int(input())
if var == 1:
    verif()
elif var == 2:
    nouveau_client()

Dernière modification par chris7522 (Le 04/02/2021, à 20:45)

Hors ligne

#2 Le 02/02/2021, à 18:21

toitoinebzh

Re : [RESOLU] Utilisation format JSON (python)

salut

en lisant rapidement le code, voilà ce que je pense
* tu risques d'avoir un souci si 2 clients ont le même prénom
* tu vas te payer une erreur si il y a une faute de frappes, par exemple entre ton 1 et 2

Hors ligne

#3 Le 02/02/2021, à 21:19

chris7522

Re : [RESOLU] Utilisation format JSON (python)

Merci de ton aide toitoinebzh smile
bzh pour Bretagne ? big_smile

Hors ligne

#4 Le 02/02/2021, à 23:16

MPython Alaplancha

Re : [RESOLU] Utilisation format JSON (python)

Bonsoir,
Il y a plusieurs problèmes dans ton code, le plus important est qu'il n'est pas opérationnel .
Si tu veux enregistrer plus d'un client, il ne peut pas fonctionner (même si les mots de passe ou les prénoms ne sont pas identiques). Ta fonction sauvegarde est à revoir ou du moins à écrire. Elle n'ajoute pas au json les nouvelles saisies mais enregistre juste le dernier venu.
Tu n'as pas testé ton code?

D'autre part, tu as fait de mauvais choix dans la construction de ton dictionnaire:
En effet, tu fais:

dict = {"password": ..., "name": ...}

Tous les clients auront pour clefs les strings "password" et "name" . Comment veux-tu les identifier?

Je lis:

name = input()
        if(isinstance(name,str)):

name étant une string ta condition sera toujours vrai. Utilise plutôt la fonction isalpha() sur ta string...

Voici comment pourrait s'écrire ton script: (améliorable et à compléter par quelques tests dont celui pour savoir si le password existe déjà afin d'accepter la saisie).:

import json

def nouveau_client():
    print("choisissez un mot de passe d'au moins 5 caracteres\
alphanumérique :")
    while True:
        password = input()
        if len(password) > 4:
            print(f"mot de passe correct\n\
Voici votre mot de passe :{password}")
            break
        print('Entrez un mot de passe de plus de 5 caractere :')
    dic = {}
    print('Entrez votre prenom :')
    while True:
        name = input()
        if name.isalpha():
            print('prenom sauvegardé')
            break    
        print('Entrez une chaine de caractère')
    dic[password] = name  
    sauvegarde(dic)
    
def sauvegarde(client):
    try:
        with open("clientbidon.json","r")as f:
            d = {}
            d = json.load(f)
            d.update(client)
    except FileNotFoundError:
        with open("clientbidon.json","w") as f: 
            json.dump(client,f)    
    else:
        with open("clientbidon.json","w") as f: 
            json.dump(d,f)
       
def verif():
    with open("clientbidon.json","r")as f:
        d = json.load(f)
    print("Entrez votre mot de passe : ")
    while True:
        password = input()
        if password in d:
            print(f"Mot de passe correct\nBienvenue {d[password]}")
            break
        print("Mot de passe incorrect,recommencer..")
    
blabla = "Bonjour , Bienvenue !\nVous etes déja client ?Tapez 1\n\
Vous etes nouveau client ? tapez 2\n "      
var = input(blabla)
if var == "1":    verif()
elif var == "2":    nouveau_client()
    

# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne

#5 Le 03/02/2021, à 12:58

chris7522

Re : [RESOLU] Utilisation format JSON (python)

Merci Beaucoup d'avoir pris le temps de tout réecrire le code ! Je ne pourrai pas réellement faire de progrès sans votre analyse et vos corrections . J'ai deja remarqué pas mal de chose que je ne connaissais pas .
    Le temps d'étudier tout ca et je reviens avec mes questions smile

Hors ligne

#6 Le 04/02/2021, à 15:34

chris7522

Re : [RESOLU] Utilisation format JSON (python)

Bonjour,

def nouveau_client():
    print("choisissez un mot de passe d'au moins 5 caracteres \
alphanumérique :")
    while True:
        password = input()
        if len(password) > 4:
            print(f"mot de passe correct\n\
Voici votre mot de passe :{password}")
            break
        print('Entrez un mot de passe de plus de 5 caractere :')

Dans cette portion de code de la fonction nouveau_client , apres le break , le "else" est facultatif ?

def sauvegarde(client):
    try:
        with open("client1.json","r")as f:
            d = {}
            d = json.load(f)
            d.update(client)
    except FileNotFoundError:
        with open("client1.json","w") as f: 
            json.dump(client,f)    
    else:
        with open("client1.json","w") as f: 
            json.dump(d,f)

Dans cette fonction , je comprends :
  Dans le bloc try , on verifie si le fichier "client1.json " existe .
       SI c'est le cas on ajoute le contenu de la variable "client" au dictionnaire que l'on vient d'ouvrir .
       SI ce n'est pas le cas , une exception est levée , on crée alors le fichier " client1.json que l'on ouvre en écriture et on ajoute le contenu de la variable " client" .

blabla = "Bonjour , Bienvenue !\nVous etes déja client ?Tapez 1\n\
Vous etes nouveau client ? tapez 2\n "

Ca aurait été trop long de mettre tout ca entre parenthese apres input(....) d'ou la variable blabla ?

Hors ligne

#7 Le 04/02/2021, à 19:53

MPython Alaplancha

Re : [RESOLU] Utilisation format JSON (python)

chris7522 a écrit :

Bonjour,

def nouveau_client():
    print("choisissez un mot de passe d'au moins 5 caracteres \
alphanumérique :")
    while True:
        password = input()
        if len(password) > 4:
            print(f"mot de passe correct\n\
Voici votre mot de passe :{password}")
            break
        print('Entrez un mot de passe de plus de 5 caractere :')

Dans cette portion de code de la fonction nouveau_client , apres le break , le "else" est facultatif ?

Je n'utilise pas else, car écrit comme ci-dessus je n'en ai pas besoin. Ça fait l'économie d'une instruction interprétée par le proc. Dans le cas de ce code, ce n'est pas vraiment important mais dans une boucle c'est du temps gagné. Tout cela c'est du domaine de l'algorithmie.

chris7522 a écrit :

 

def sauvegarde(client):
    try:
        with open("client1.json","r")as f:
            d = {}
            d = json.load(f)
            d.update(client)
    except FileNotFoundError:
        with open("client1.json","w") as f: 
            json.dump(client,f)    
    else:
        with open("client1.json","w") as f: 
            json.dump(d,f)

Dans cette fonction , je comprends :
  Dans le bloc try , on verifie si le fichier "client1.json " existe .
       SI c'est le cas on ajoute le contenu de la variable "client" au dictionnaire que l'on vient d'ouvrir .
       SI ce n'est pas le cas , une exception est levée , on crée alors le fichier " client1.json que l'on ouvre en écriture et on ajoute le contenu de la variable " client" .

Oui, dans l'idée ça peut se traduire comme tu le dis.

chris7522 a écrit :
blabla = "Bonjour , Bienvenue !\nVous etes déja client ?Tapez 1\n\
Vous etes nouveau client ? tapez 2\n "

Ca aurait été trop long de mettre tout ca entre parenthese apres input(....) d'ou la variable blabla ?

C'est juste pour la visibilité. La PEP 8 préconise de ne pas dépasser 79 caractères par lignes.


Je t'ai demandé sur un autre post d'éditer tous les titres de tes discussions avec la mention [Résolu] comme le demande le forum. Merci de le faire.
Je t'invite aussi à bien choisir le titre de tes posts. En effet, un titre bien choisi t'apportera plus de réponses et permet un référencement pertinent de la discussion par les moteurs de recherche. Ainsi, les réponses qui te sont apportées peuvent aussi profiter à d'autres personnes wink

Dernière modification par MPython Alaplancha (Le 07/02/2021, à 00:35)


# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne

#8 Le 04/02/2021, à 20:57

chris7522

Re : [RESOLU] Utilisation format JSON (python)

Merci de ton aide .
  J'avais l'intention de placer la mention "resolu" , je n'aurai pas du attendre autant de temps pour le faire wink

Hors ligne

#9 Le 04/02/2021, à 21:05

MPython Alaplancha

Re : [RESOLU] Utilisation format JSON (python)

smile


# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne

#10 Le 06/02/2021, à 08:33

chris7522

Re : [RESOLU] Utilisation format JSON (python)

Bonjour a tous ,
    J'ai ajouté cette nouvelle fonction a celles existantes . Je voulais :
    - retourner le mot de passe sur le compte mail de la personne en cas d'oubli .( a partir de la valeur du dico , le prénom dans mon exemple)
    - Après 3 tentatives infructueuses , lui permettre de créer un compte .

   J'ai essayé de faire comme j'ai pu , c'est brouillon et peu efficace et surtout je n'arrive a faire partir mon email sur le compte !
   J'y ai passé l'après-midi et j'ai besoin de votre aide .

def send_email():
    sender_email = " *****@gmail.com "
    receiver_email = " *****@gmail.com "
    port = 465  
    password = " ****** "
    
    with open("client1.json","r")as f:
        d = json.load(f)
    cpt = 0
    while cpt < 3:
        prenom = input(str('Veuillez entrer votre prenom :\n'))
        if prenom in d.values():
            break
        print("Prenom inconnu ")
        cpt += 1
    if cpt >= 3:
        print("Vous pouvez creer un compte client .")
        nouveau_client()
        
    password_recovery = [x for x,v in d.items()if v == prenom]
    a = " Votre mot de passe :"
    b = str(password_recovery)
    message = a + b
    
    context = ssl.create_default_context()
    with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context)as server:
        server.login("******@gmail.com", password)
        server.sendmail(sender_email, receiver_email,message)
        print('Votre mot de passe a été envoyé a votre adresse mail')

D'avance je vous en remercie.

Hors ligne

#11 Le 06/02/2021, à 10:52

MPython Alaplancha

Re : [RESOLU] Utilisation format JSON (python)

Bonjour,
Je passe en coup de vent (j'ai à faire). Je m'attarderai un peu plus tard sur ta problèmatique si d'ici là tu n'obtiens pas de réponse.
Par contre, merci de créer un nouveau sujet pour de nouvelles questions (tu peux y glisser le lien de cette conversation) comme le demande le site... (et pour les raisons que j'ai évoqué en #7) wink


# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne

#12 Le 06/02/2021, à 14:03

chris7522

Re : [RESOLU] Utilisation format JSON (python)

J’avoue ne pas savoir comment  faire pour glisser le lien vers un nouveau  sujet hmm

Hors ligne

#13 Le 06/02/2021, à 22:06

MPython Alaplancha

Re : [RESOLU] Utilisation format JSON (python)

Pour créer un lien vers d'une page:  depuis la  page en question, tu fais un copié de l'adresse qui est marqué dans ton navigateur . cette adresse est le lien .
-->Pour cette page ça donne ceci:  https://forum.ubuntu-fr.org/viewtopic.php?id=2061570

Ceci dit, tu peux te contenter de créer une nouvelle discussion que tu pourrais nommer, par exemple "Comment envoyer un mail avec python" puisque c'est cela qui semble te préoccuper. Je t'y répondrais wink

édit:
je lis:

while cpt < 3:
        prenom = input(str('Veuillez entrer votre prenom :\n'))
        if prenom in d.values():
            break
        print("Prenom inconnu ")
        cpt += 1
    if cpt >= 3:
        print("Vous pouvez creer un compte client .")
        nouveau_client()

Ce serait plutôt:

cpt =0
while True:
    if prenom:= input('Veuillez entrer votre prenom :\n')  in d.values():
        break
    print("Prenom inconnu ")
    cpt += 1
    if cpt == 3:
        print("Vous pouvez creer un compte client .")
        nouveau_client()
        break

Cependant, ce n'est pas le prénom qu'il faut demander mais le mdp qui lui est unique(il peut y avoir plusieurs prénoms identiques)
édit2:
Je lis :

password_recovery = [x for x,v in d.items()if v == prenom]
    a = " Votre mot de passe :"
    b = str(password_recovery)
    message = a + b

?? avec un dico on utilise une compréhention de dictionnaire. et puis mettre ça ici ça n'a  pas de sens

Dernière modification par MPython Alaplancha (Le 06/02/2021, à 22:59)


# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne

#14 Le 06/02/2021, à 23:14

MPython Alaplancha

Re : [RESOLU] Utilisation format JSON (python)

Je pense que tu devrais laisser de côté ton projet et y revenir dans quelque temps lorsque tu auras avancé ton mooc.
Pour construire une maison on commence par faire une fondation solide sans quoi elle s'écroule au moindre vent.
Il en est de même en programmation wink
N'hésite pas à utiliser le forum pour des questions précises. wink
Voici mon conseil : travaille tes bases, fini le mooc, fais les exercices de tes cours et tu réaliseras ton projet les doigts dans le nez:)


# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne

#15 Le 07/02/2021, à 20:04

chris7522

Re : [RESOLU] Utilisation format JSON (python)

Merci de ton aide .
    Je vais suivre tes sages conseils et finir le mooc !
smile
    C'est vrai que je ne maitrise pas grand chose pour le moment . Je sais que l'apprentissage des bases est indispensable mais ,  j'ai l'impression de retenir peu de chose  .
    En revanche , lorsque j'essaie de reproduire un mini projet fun et amusant , je mémorise beaucoup plus facilement  .
C'est peut etre intéressant de faire les deux pour progresser plus rapidement . Qu'en pensez vous ?

Dernière modification par chris7522 (Le 07/02/2021, à 21:06)

Hors ligne

#16 Le 08/02/2021, à 22:08

MPython Alaplancha

Re : [RESOLU] Utilisation format JSON (python)

chris7522 a écrit :

lorsque j'essaie de reproduire un mini projet fun et amusant , je mémorise beaucoup plus facilement

Idem. On apprend aussi avec le coeur. smile Et puis lorsque quelque chose est source de plaisir pourquoi s'en priver?

chris7522 a écrit :

C'est peut etre intéressant de faire les deux pour progresser plus rapidement . Qu'en pensez vous ?

(de mon point de vu) oui si ton code utilise ce que tu as déjà appris mais pas forcément assimilé.
Par contre, je pense que te pencher sur des librairies comme smtplib, ne t'apprendra pas à mieux utiliser python. (mais ça peut éventuellement à t'exercer à lire la doc)


# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne