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

1
def pseudo_present(table,pseudo):
2
    """
3
    Vérifie la présence d'un pseudo dans une table de comptes
4
    """
5
    pass
6
7
def inserer(nom_fichier, clefs, enregistrement):
8
    """
9
    Insère un enregistrement à la fin d'un fichier csv
10
    Paramètres :
11
      nom_fichier : chemin d'un fichier csv (chaine de caractères)
12
      clefs : tableau des descripteurs du fichier csv
13
      enregistrement : dictionnaire dont les clefs sont les éléments de clefs, auxquelle sont associées des chaines de caractères
14
    Valeur renvoyée : None
15
    """
16
    pass
17
18
if __name__=='__main__':
19
    pseudo=input("Entrez votre pseudo : ")
20
21
    # on importe la table utilisateur et on teste si le pseudo existe
22
    ...
23
        
24
    if True: # on vérifie la présence du pseudo (condition à remplacer)
25
        print ("Pseudo déjà utilisé, désolé")
26
    else: # on continue l'insctiption si le pseudo est disponible
27
        nom=input("Entrez votre nom : ")
28
        prénom=input("Entrez votre prénom : ")
29
        âge=input("Entrez votre âge : ")
30
31
        # on crée le dictionnaire avec les informations
32
        ...
33
        # on effectue l'inscription dans la table avec inserer()
34
        ...
35
36
        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.

SimulationSimulations 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...

SimulationSimulations 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 :

1
for i in {1..10}
2
do
3
  MaCommande
4
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©) :

1
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 ?