question de curiosité en python

a marqué ce sujet comme résolu.

bonjour je travaille avec un fichier pickle et j'aimerais verifier si un nom d'utilisateur se trouve dans le fichier:

voici tout d'abord le code complet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import sys  # manage outpouts
import hashlib  # hash the password and encrypt it
import pickle  # serialization of the database

database = {} # create a database as a dictionnary with passwords encrypted for keys

if len(sys.argv) < 3:
    print('[Usage] python manager.py <username> <password>')
    sys.exit()

username = sys.argv[1]
password = (sys.argv[2].encode())

password = hashlib.sha1(password).hexdigest()
database[username] = password

with open('database.pickle', 'ab') as file:
    my_pickler = pickle.Pickler(file)
    my_pickler.dump(database)

def database_loader():
    with open('database.pickle', 'rb') as file:
        while True:
            try:
                loaded = pickle.load(file)
                print(loaded)
                for c in loaded:
                    if c == sys.argv[1]:
                        print('ok')
                    else:
                        sys.exit()
            except EOFError:
                break
            else:
                database.update(loaded)

database_loader()

donc tout se joue au niveau de la boucle for c in loaded, ce que je voudrais faire c'est: SI après la vérification de tous les noms d'utilisateurs dans le fichier il n'y a pas le nom d'utilisateur rentré alors ACCES BLOQU2, c'est impossible ? Ave vous une alternative ? Merci !

Bonsoir,

Tu pourrais sortir de ta fonction dès qu'une correspondance avec un utilisateur est trouvée dans le fichier.

Ainsi, si tu es toujours dans la fonction en fin de boucle, c'est qu'aucun utilisateur ne correspondait, et donc que l'accès est refusé.

En même temps pourquoi tester l'égalité explicitement quand on peut écrire if sys.argv[1] in loaded ?

Par ailleurs pourquoi vouloir faire ta base de données avec pickle et pas avec un sgbd un peu plus fourni comme sqlite ou redis ?

+0 -0

J'ai une question : il sert à quoi le while ?

Kje

Je pense qu'il a écrit plusieurs dumps pickle à la suite dans son programme (pickle.dump prend un fichier en paramètre, mais peut-être appelé plusieurs fois avec ce même fichier). Ainsi, chaque pickle.load permet de récupérer l'objet suivant enregistré dans le fichier, jusqu'à EOF.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
>>> import pickle
>>> with open('data.pickle', 'wb') as f:
...     pickle.dump('hello', f)
...     pickle.dump(42, f)
...     pickle.dump([None], f)
...
>>> with open('data.pickle', 'rb') as f:
...     pickle.load(f)
...     pickle.load(f)
...     pickle.load(f)
... 
'hello'
42
[None]

Plutôt cool, du coup je serais bien tenter de mettre un suppress(EOFError) pour pas à faire ce break finalement.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 with open('database.pickle', 'rb') as file, contextlib.suppress(EOFError):
    while True:
        loaded = pickle.load(file)
        print(loaded)
        for c in loaded:
            if c == sys.argv[1]:
                print('ok')
            else:
                sys.exit()
        database.update(loaded)
+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte