Manipuler un répertoire téléphonique csv en python

Résolu
Will -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

J'ai écrit le code python ci-dessus. Je dois créer une fonction qui me permet de chercher le nom d'une personne, et si le nom est trouvé, de dire son nom, prénom et téléphone, et sinon d'afficher un message indiquant qu'elle est introuvable.

import csv
data_to_append = [
    ['NOM', 'Prenom', 'Telephone'],
    ['BILL','Phil', '0692451234'],
    ['TACK', 'Loic', '0262849013']
]
repertoire = open('reper.csv', 'w', newline='')
writer = csv.writer(repertoire)
writer.writerows(data_to_append)
repertoire.close() 

J'ai aussi fait un autre code qui me permet juste d'afficher les noms qui pourra peut être m'aider pour faire la fonction mais je suis pas sûr.

with open('reper.csv', 'r', encoding='utf8') as mon_fichier:
    repertoire = mon_fichier.readlines()
for ligne in repertoire : 
    colonne = ligne.split(',')
    print(colonne[0])

Est-ce que vous pouvez m'aider s'il vous plaît je galère depuis des jours ?

Merci d'avance

4 réponses

  1. jee pee Messages postés 31867 Date d'inscription   Statut Modérateur Dernière intervention   9 973
     

    Bonjour,

    Il te faut mettre ton second script dans une fonction qui reçoit un paramètre rech_nom(nom), et tester dans la boucle la concordance entre colonne[0] et nom

    Puis dans le corps du programme tu saisis avec un input le nom à rechercher et ce nom tu le passes en paramètre à la fonction.

    Cette solution comporte une petite anomalie, il faudrait ne pas traiter la première ligne qui comporte les titres de colonnes, ne pas répondre Trouvé si l'utilisateur saisit 'NOM'. Et dans tes consignes, tu utilises la bibliothèque csv pour créer le fichier, ne dois tu pas aussi l'utiliser en lecture ?


    0
  2. Will
     

    Bonjour, 

    Normalement je ne dois pas importer de bibliothèque, mais je n'y arrivais pas sans. Du coup, j'ai utilisé la bibliothèque csv

    0
    1. jee pee Messages postés 31867 Date d'inscription   Statut Modérateur Dernière intervention   9 973
       

      Si tu veux créer un fichier texte au même format que le .csv, tu peux utiliser la méthode inverse de .split(), .join()

      data_to_append = [['NOM','Prenom','Telephone'],
          ['BILL' ,'Phil', '0692451234'],
          ['TACK', 'Loic', '0262849013']]
      
      with open('repertoire.txt', 'w', encoding='utf8') as mon_fichier:
          for ligne in data_to_append:
              mon_fichier.write(','.join(ligne)+'\n')
          mon_fichier.close()
      
      with open('repertoire.txt', 'r', encoding='utf8') as mon_fichier:
          repertoire=mon_fichier.readlines()
          for ligne in repertoire :
              colonne= ligne.split(',')
              print(colonne[0])
          mon_fichier.close()
      


      (*) pour obtenir la coloration syntaxique du code, dans la saisie, il faut choisir le langage, Python
       

      0
  3. PierrotLeFou
     

    Un fichier CSV a une entête qui te dérange sans doute. Tu pourrais écrire le fichier avec le write ordinaire: file.write.
    Tu peux utiliser tout de même la virgule comme séparateur. Tu pourrais regarder la méthode join() pour tout coller ensemble.
    N'oublie pas la fin de ligne '\n'
    Pour lire, tu es bien parti avec le split.
    Il suffit de vérifier pour chaque ligne lue et séparée si les valeurs aux indices désirées sont égales à ce que tu cherches.

    0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     

    Bonjour,

    Voici comment tu peux faire :

    import sys
    
    entries = [
        ['NOM', 'Prenom','Telephone'],
        ['BILL' ,'Phil', '0692451234'],
        ['TACK', 'Loic', '0262849013']
    ]
    
    def entries_to_csv(entries: list) -> str:
        return "\n".join(
            ",".join(
                str(value)
                for value in entry
            )
            for entry in entries
        )
    
    def load_csv(f) -> list:
        return list(
            line.strip().split(",")
            for line in f.readlines()
        )
    
    def find_entry(entries: list, name: str) -> list:
        return filter(
            lambda entry: entry[0] == name,
            entries
        )
    
    with open("repertoire.csv", "w") as f:
        print(entries_to_csv(entries), file=f)
    
    with open("repertoire.csv", "r") as f:
        entries2 = load_csv(f)
        print(entries2)
    
    for name in ("BILL", "TACK", "PLOP"):
        found_entries = list(find_entry(entries2, name))
        if not found_entries:
            print(f"Searched {name}: not found", file=sys.stderr)
        else:
            print(f"Searched {name}: {len(found_entries)} result(s) found: {found_entries}")

    Résultat :

    [['NOM', 'Prenom', 'Telephone'], ['BILL', 'Phil', '0692451234'], ['TACK', 'Loic', '0262849013']]
    Searched BILL: 1 result(s) found: [['BILL', 'Phil', '0692451234']]
    Searched TACK: 1 result(s) found: [['TACK', 'Loic', '0262849013']]
    Searched PLOP: not found

    Bonne chance

    0