Question sauvegarde de set

Résolu/Fermé
yamar - Modifié le 3 févr. 2022 à 19:52
 yamar - 7 févr. 2022 à 23:05
Bonjour,

J'essaie de créer un programme qui va sur un site de générateur de prénom grâce à sélénium. Puis qui me sauvegarde le prénom dans un document afin que quand je relance le programme, je ne perde pas les prénoms enregistrés les dernières fois.
Donc ça me donnerai un truc comme ça :
fichier = open('fichier.txt', 'a')
prenom = # pour ne pas tout écrire on va dire que prenom = un prénom au hasard 
fichier.write(' ')
fichier.write(prenom)
fichier.close()


Mais, j'aimerais que ça ne m'écrive pas deux fois le même prénon. En soit, j'aimerais que se soit un set qui s'ouvre début de mon programme et qui est sauvegardé à la fin de mon programme.
(ce programme est un exercice que je me suis fait pour progresser, alors même si dans ce programme ce n'est pas particulièrement nécessaire, j'aimerais que ça marche assez fluidement même quand il y aura plusieurs milliers de valeurs à tester).

Merci de m'avoir lu


Configuration: Windows / Chrome 98.0.4758.87
A voir également:

4 réponses

mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 7 802
4 févr. 2022 à 13:49
Bonjour,

Effectivement, tu peux stocker tes éléments dans un
set
, puis itérer sur cet ensemble pour réécrire ton fichier. Quand tu ouvres un fichier, je te recommande d'utiliser le context manager dedié (voir
with
).

Par rapport au code que tu proposes, plutôt que de s'embêter avec
write
tu peux directement utiliser
print
dont l'un des paramètres permet de spécifier le fichier dans lequel on écrit (par défaut
sys.stdout
)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

filename = "prenoms.txt"
prenoms = set()
with open(filename, "r") as f:
    for line in f.readlines():
        prenom = line.strip()
        prenoms.add(prenom)

prenoms.add("Jessica")
with open(filename, "w") as f:
    print("\n".join(prenoms), file=f)


Note que tu peux aussi considérer des formats de stockage binaires (souvent plus compacts et plus rapides à charger) par exemple en utilisant
pickle
. le problème c'est que pickle ne gère pas les
set
s donc on est obligé de passer d'y sauver une liste et de la convertir en
set
.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pickle

filename = "prenoms.pkl"
try:
    with open(filename, "rb") as f:
        prenoms = set(pickle.load(f))
except:
    prenoms = {"Léa", "Marc", "Maya"}
print(prenoms)

prenoms.add("Jessica")
with open(filename, "wb") as f:
    pickle.dump(list(prenoms), f)


Une manière plus élégante de procéder, c'est d'utiliser
dill
, qui lui supporte les
set
. Son inconvénient (et qui explique peut être pourquoi
pickle
est encore utilisé), c'est qu'il n'est pas installé de base (il faut donc l'installer via PIP, e.g.
sudo pip3 install dill
ou sous Linux via son gestionnaire de paquets, e.g.
sudo apt install python3-dill
). Bref, voici à quoi ça ressemble, comme tu peux le voir c'est presque le même code :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pickle

filename = "prenoms.dill"
try:
    with open(filename, "rb") as f:
        prenoms = dill.load(f)
except:
    prenoms = {"Léa", "Marc", "Maya"}
print(prenoms)

prenoms.add("Jessica")
with open(filename, "wb") as f:
    dill.dump(prenoms, f)


Tu peux aussi comme le propose yg_be utiliser une base de donnée, même si ici ça me paraît inutilement compliqué. C'est souvent un stockage plus pratique qu'un fichier texte pour permettre des accès concurrents, en particulier quand la donnée est structurable sous forme de tables. Ici on parle d'une simple liste/ensemble. Note que pour gérer les doublons, il faudrait en plus faire des vérifications à l'insertion, bref ça n'est pas forcément le plus pratique.

Bonne chance
2
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
3 févr. 2022 à 20:37
bonjour,
l'étape suivante, je pense, c'est la création du set au démarrage du programme.
1
Ça voudrait dire que au début du programme, je crée un set dans le quel j'ajoute tout les éléments de mon doc puis a la fin je relance ce que contient mon doc par ce que contient mon set? Merci beaucoup, je vais faire ça
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550
4 févr. 2022 à 12:20
Une autre possibilité serait d'enregistrer les prénoms dans un base de données.
0
Merci beaucoup
0