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

Résolu/Fermé
Will - Modifié le 15 nov. 2022 à 18:38
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 15 nov. 2022 à 18:50

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

A voir également:

4 réponses

jee pee Messages postés 39613 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 avril 2024 9 230
Modifié le 13 nov. 2022 à 10:26

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

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
jee pee Messages postés 39613 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 avril 2024 9 230
Modifié le 13 nov. 2022 à 11:53

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
PierrotLeFou
13 nov. 2022 à 18:29

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
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 15 nov. 2022 à 18:51

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