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 !

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