Limites du CSV
Nous allons voir dans ces 2 parties, les limites de la manipulation de fichier CSV avec un langage de programmation tel que Python.
Partie 1 : problème de validité des données
Programme d'inscription
Créer un fichier utilisateurs.csv avec les descripteurs précédents : Nom, Prénom, Âge et Pseudo
Créer un module inscription.py en complétant le code ci-dessous, pour cela :
Compléter le module, sous la ligne if __name__=='__main__': dans le squelette ci-dessous, afin qu'à l'exécution ce module
demande un pseudo
vérifie qu'il n'est pas dans la table utilisateurs.csv, affiche « Pseudo déjà utilisé » et termine s'il y est
demande le nom, le prénom et l'âge
inscrit l'utilisateur dans la table utilisateurs.csv
def pseudo_present(table,pseudo):
"""
Vérifie la présence d'un pseudo dans une table de comptes
"""
pass
def inserer(nom_fichier, clefs, enregistrement):
"""
Insère un enregistrement à la fin d'un fichier csv
Paramètres :
nom_fichier : chemin d'un fichier csv (chaine de caractères)
clefs : tableau des descripteurs du fichier csv
enregistrement : dictionnaire dont les clefs sont les éléments de clefs, auxquelle sont associées des chaines de caractères
Valeur renvoyée : None
"""
pass
if __name__=='__main__':
pseudo=input("Entrez votre pseudo : ")
# on importe la table utilisateur et on teste si le pseudo existe
...
if True: # on vérifie la présence du pseudo (condition à remplacer)
print ("Pseudo déjà utilisé, désolé")
else: # on continue l'insctiption si le pseudo est disponible
nom=input("Entrez votre nom : ")
prénom=input("Entrez votre prénom : ")
âge=input("Entrez votre âge : ")
# on crée le dictionnaire avec les informations
...
# on effectue l'inscription dans la table avec inserer()
...
print("Bienvenue.")
Le fichier ci-dessous est un exemple de correction pour le module d'inscription. Cherchez d'abord la solution par vous même avant de regarder la correction.
Simulation : Simulations d'inscriptions parallèles
Imaginer les problèmes que peut poser ce système s’il est utilisé pour plusieurs inscriptions simultanées, par exemple sur un serveur.
Se connecter à deux terminaux de votre système.
Dans le premier, lancer le programme puis saisir un pseudo, par exemple ‘Roger'.
Passer au deuxième terminal, lancer le programme, saisir le même pseudo puis terminer l'inscription
Terminer l'inscription dans le premier terminal.
Observer le contenu de utilisateurs.csv ; que constatez-vous ? Expliquez...
Simulation : Simulations d'inscriptions parallèles semi-automatisés
Créer un module simulation.py qui a le même fonctionnement mais non interactif : il remplace les entrées de l'utilisateur par le choix aléatoire d'une chaîne de caractères dans un tableau de cinq possibilités
On pourra utiliser la fonction choice()
du module random
pour le choix aléatoire dans une liste.
Ajouter un temps d'attente aléatoire après la vérification de la présence du pseudo (pour simuler une recherche plus longue dans une très grosse table).
Pour ce temps aléatoire, on peut donner en paramètre de la fonction sleep
du module time
le nombre 0.5*random()
, où random
est importée du module random
, pour une attente d'une durée aléatoire entre 0 et 500ms.
Utiliser une commande ou un script shell pour lancer en parallèle dix instances de ce programme. Constater encore une fois que l'unicité du pseudo n'est pas garantie.
La commande python3 simulation.py
lance le programme et attend la fin de son exécution.
La commande python3 simulation.py&
lance le programme et rend immédiatement la main, ce qui permet de faire autre chose en parallèle de l'exécution du module python, si elle est encore en cours.
On pourra se rappeler la création d'un script shell (tout en bas)... et utiliser ce type de boucle en shell :
for i in {1..10}
do
MaCommande
done
Pour exécuter ce script shell, nommé ici simul.sh
, on pourra utiliser le commande suivante sur un système Gnu/Linux (voici une aide pour ceux qui sont encore sous Windows©) :
bash simul.sh
Le fichier ci-dessous est un exemple de correction pour le module d'inscription automatique. Cherchez d'abord la solution par vous même avant de regarder la correction.
Partie 2 : problème d'intégrité des données
On propose une parade simple au problème qui se pose dans la partie précédente : garder le fichier ouvert entre la recherche du pseudo et l'inscription finale, pour bloquer l'accès à la table entre ces deux étapes et ainsi garantir la validité de la vérification.
Obtenir la liste des modes d'ouverture utilisables en deuxième paramètre de open et choisir le plus adapté à notre nouveau besoin.
On évite les modes 'x', 'w' et 'a' qui ne conviennent pas. Dans notre cas, on choisit 'r+'. Explicitez ce mode...
Effectuer une copie du module simulation.py qui s'appelle simulation2.py. Le modifier pour qu'il n'effectue qu'une seule ouverture du fichier, en mode 'r+', au début du bloc 'if __name__=='__main__':, puis le ferme à la fin de ce bloc avec .close().
Ajouter également, avec print, des indications au début et à la fin de ce bloc, pour donner des indications supplémentaires du bon traitement des données.
Le fichier ci-dessous est un exemple de correction pour le module d'inscription automatique, version 2. Cherchez d'abord la solution par vous même avant de regarder la correction.
Exécuter 10 fois ce script en parallèle, comme précédemment. Qu'observe-t-on ?