IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Pistes sur fichier csv


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Par défaut Pistes sur fichier csv
    Bonjour,

    J'ai écrit le petit algorithme ci-dessous qui permet de modéliser un graphe orienté simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    import csv 
    class Graphe(object):
            def __init__(self):
                    self.sommet, self.succ = [], []            
            def ajouterSommet(self):
                    nouv_som = str(input("Entrez un nom de sommet : "))
                    if nouv_som in self.sommet:
                            print("Attention! Ce nom de sommet est deja dans la liste.")
                            nouv_som = str(input("Entrez un nouveau nom : "))
                            while nouv_som in self.sommet:
                                    if nouv_som in self.sommet:
                                            print("Attention! Ce nom de sommet est deja dans la liste.")
                                            nouv_som = str(input("Entrez un nouveau nom : "))
                            self.sommet.append(nouv_som)
                            self.succ.append([])
                    else:
                            self.sommet.append(nouv_som)
                            self.succ.append([])                                   
            def ajouterArc(self):
                    ext_ini = str(input("Entrez le nom de l'extremite initiale : "))
                    ext_fin = str(input("Entrez le nom de l'extremite finale : "))
                    a = 0
                    b = 0
                    if ext_ini in self.sommet and ext_fin in self.sommet:                   
                            a = self.sommet.index(ext_ini)
                            b = self.sommet.index(ext_fin)
                    elif not ext_ini in self.sommet and ext_fin in self.sommet:
                            self.sommet.append(ext_ini)
                            self.succ.append([])
                            a = self.sommet.index(ext_ini)
                            b = self.sommet.index(ext_fin)
                    elif ext_ini in self.sommet and not ext_fin in self.sommet:
                            self.sommet.append(ext_fin)
                            self.succ.append([])
                            a = self.sommet.index(ext_ini)
                            b = self.sommet.index(ext_fin)
                    else:
                            self.sommet.append(ext_ini)
                            self.sommet.append(ext_fin)
                            self.succ.append([])
                            self.succ.append([])
                            a = self.sommet.index(ext_ini)
                            b = self.sommet.index(ext_fin)
                    if b in self.succ[a]:
                            print("Attention! Cette relation existe deja. Le doublon va etre enleve.")
                            self.succ[a].remove(b)
                    self.succ[a].append(b)
     
            def affichageGraphe(self):
                    print("Le(s) sommet(s) est\sont : " + str(self.sommet))
                    print("Le(s) successeur(s) est\sont : " + str(self.succ))
    Il fonctionne bien et je veux maintenant stocker le(s) graphe(s) créé(s) dans des fichiers au format csv de manière à permettre une édition éventuelle avec un tableur. Le(s) graphe(s) sera/seront stocké(s) de la façon suivante :
    1. chaque ligne doit contenir la description d'un sommet ou d'un arc sur deux colonnes,
    2. une ligne qui décrit un sommet doit contenir en première colonne le nom du graphe et en deuxième colonne le texte "-",
    3. une ligne qui décrit un arc doit contenir en première colonne le nom de l'extrémité initiale de l'arc et dans la deuxième colonne le nom de l'extrémité finale de l'arc.

    exemple :

    a;- # premier sommet
    b;- # deuxième sommet
    c;- # troisième sommet
    a;c # premier arc
    b;a # deuxième arc
    b;c # troisième arc

    Je n'ai jamais travaillé avec des fichiers csv, et je n'ai aucune idée sur le(s) fonction(s) à ajouter. Pouvez-vous me suggérer des pistes, s'il vous plaît. D'avance je vous remercie.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par selver057 Voir le message
    Je n'ai jamais travaillé avec des fichiers csv, et je n'ai aucune idée sur le(s) fonction(s) à ajouter. Pouvez-vous me suggérer des pistes, s'il vous plaît. D'avance je vous remercie.
    Salut

    Un fichier csv n'est qu'un bête fichier au format texte. Il s'agit donc juste de fonctions d'ouverture, écriture et fermeture de fichier
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fp=open("toto.csv", "w")
    fp.write("a;- # premier sommet\n")
    fp.write("b;- # deuxième sommet\n")
    fp.write("c;- # troisième sommet\n")
    fp.write("a;c # premier arc\n")
    fp.write("b;a # deuxième arc\n")
    fp.write("b;c # troisième arc\n")
    fp.close()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    La solution de Sve@r est probablement largement suffisante pour ce que tu veux faire, mais pour info, Python dispose aussi du module csv.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mont29 Voir le message
    La solution de Sve@r est probablement largement suffisante pour ce que tu veux faire, mais pour info, Python dispose aussi du module csv.
    Ben en fait, quand on regarde son code, on voit qu'il l'intègre déjà. Mais c'est vrai que pour juste claquer une image d'un truc mémoire au format texte séparé par un délimiteur x, il n'est pas super utile...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    L’avantage du module csv, c’est qu’il permet de gérer les différents dialectes de ce «*standard*»…

  6. #6
    Membre expérimenté Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Par défaut
    Bonjour je propose le code suivant (si j'ai bien compris le problème)
    - Afin de ne pas avoir gérer des index de list pour retrouver les sommets, je te propose d'utiliser un dictionnaire.
    - Les successeurs d'un sommet sont placés sur une liste
    - L 'orientation est donnée par le fait que la liste des successeurs "partent" du sommet.

    Cela donne dans ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.sommets={'a': ['c'], 'c': [], 'b': ['a', 'c']}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    import csv
     
    class Graphe(object):
            def __init__(self):
                    self.sommets={} # Les sommets sont dans un dictionnaire
     
            def ajouterSommet(self,nouv_som=False):
                nouv_som = raw_input("Entrez un nom de sommet : ")
                if nouv_som in self.sommets:
                    print "Attention! Ce nom de sommet est deja dans la liste."
                    self.ajouterSommet()
                else:
                    self.sommets[nouv_som]=[] # Chaque sommet contient une liste de successeurs
     
            def ajouterArc(self):
                    ext_ini =raw_input("Entrez le nom de l'extremite initiale : ")
                    ext_fin = raw_input("Entrez le nom de l'extremite finale : ")
     
                    if ext_ini not in self.sommets:
                        print "Attention ! Le sommet initial n'existe pas"
                    elif ext_fin not in self.sommets:
                            print "Attention ! Le sommet final n'existe pas"
                    elif ext_fin in self.sommets[ext_ini]:
                        print "Attention ! Cette relation existe deja"
                    elif ext_fin==ext_ini :
                        print "Attention ! creation de boucle"
                    else :
                        print "rajout de ",ext_ini,ext_fin
                        self.sommets[ext_ini].append(ext_fin) # Rajout du successeur dans la liste
     
            def affichageGraphe(self):
                    print("Le(s) sommet(s) est\sont : " + str(self.sommets))
     
            def writeCsv(self):
                fw=open('some.csv', 'wb')
                writer = csv.writer(fw,delimiter=';')
                for sommet in self.sommets :
                    ligne=[sommet,"-"]
                    writer.writerow(ligne)
                for ext_ini in self.sommets :
                    for ext_fin in self.sommets[ext_ini]:
                        ligne=[ext_ini,ext_fin]
                        writer.writerow(ligne)
     
    g=Graphe()
    g.ajouterSommet()
    g.ajouterSommet()
    g.ajouterSommet()
    g.ajouterArc()
    g.ajouterArc()
    g.ajouterArc()
    g.affichageGraphe()
    g.writeCsv()

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 149
    Par défaut
    Il y a très longtemps, en 1998, Guido Van Rossum, créateur de Python, a proposé une implémentation des graphes en Python :
    Python Patterns - Implementing Graphs

    Cette solution a été adaptée par tous les modules qui traitent des graphes en Python (Networkx etc.)

    Comme proposé par alexdvl, un graphe est codé avec un dictionnaire, de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    graph = {'A': ['B', 'C'],
                 'B': ['C', 'D'],
                 'C': ['D'],
                 'D': ['C'],
                 'E': ['F'],
                 'F': ['C']}
    A partir de cette structure, Guido Van Rossum montre comment implémenter les algorithmes de la théorie des graphes (chemins etc.)

  8. #8
    Membre expérimenté Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Par défaut
    Merci de la recherche genemartin

    J'avais voulu trouver une solution simple, je vois que certain (illustre) y ont pensé avant moi !
    Notez que dans pratiquement tout mes logiciels python j'utilise un dictionnaire pour définir les objets car ceci permet de récupérer facilement des ''attributs'' je ne dois pas être le seul.

    A+

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Par défaut Pistes sur fichier csv
    Merci à tous pour les réponses.

    @ alexdevl : ta version avec le dictionnaire est très intéressante et m'offre une excellente alternative pour la modélisation de mon graphe en python. Je la garde sous le coude et pour le moment je préfère continuer à travailler avec ma version. Afin de bien comprendre ta fonction writeCSV, pourrais-tu répondre à ces questions s'il te plaît :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fw=open('some.csv', 'wb')
    1. Que fait exactement l'objet 'fw' et qu'est-ce que 'wb'?
    2. Est-ce que je peux remplacer cette ligne par la ligne ci-dessous? Le résultat sera-t-il le même?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cw = csv.writer(open("some.csv",'w'))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer = csv.writer(fw,delimiter=';')
    3. Que fait exactement cette ligne? Est-ce que je peux la remplacer par ce qui suit au vu des changements que je propose plus haut?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer = csv.writer(cw,delimiter=';')

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 31
    Par défaut Pistes sur fichier csv
    Je pense avoir trouvé la fonction qui convient en m'inspirant en partie du code d'alexdevl et du module csv de python :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     def stockageCsv(self):
                    cw = csv.writer(open('sommet.csv','w'), delimiter=';')
                    for nouv_som in self.sommet:
                            ligne = [nouv_som,'-']
                            cw.writerow(ligne)
                    for ext_ini in self.sommet:
                            for ext_fin in self.sommet:
                                    ligne = [ext_ini,ext_fin]
                                    cw.writerow(ligne)
                    cw.close()
    Pouvez-vous me dire s'il vous plaît si c'est juste? Je n'arrive pas à tester cette fonction. J'ai un message d'erreur qui s'affiche comme suit :


    AttributeError: 'Graphe' object has no attribute 'stockageCSV'

    Je vous remercie par avance pour l'aide que vous voudrez bien m'apporter.

  11. #11
    Membre expérimenté Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Par défaut
    Bonsoir,

    1 'fw' est un objet dont le but est d'écrire un fichier grace à des méthodes spécifiques.

    2. Tout est compactable, après à voir si cela apporte quelque chose.

    3. A partir d'un objet fichier destiné à l'écriture, est fabriqué un nouvel objet avec des méthodes spécifiques à l'écriture au format csv.
    C'est comme si fw est l'objet ''page blanche'' et que l'on fabrique l'objet ''page à carreau''(=writer) à partir de l'objet page blanche

    #10 La méthode s'appelle stockageCsv et tu appelle stockageCSV.

    note :
    Pour suivre la PEP8 les fonctions devraient être en lower_case_with_underscores
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Method Names and Instance Variables
          Use the function naming rules: lowercase with words separated by
          underscores as necessary to improve readability.
    exemple :
    stockage_csv

Discussions similaires

  1. [AC-2000] Suppression lignes sur fichier CSV depuis Access
    Par electronedf dans le forum VBA Access
    Réponses: 8
    Dernier message: 25/10/2010, 13h35
  2. tri sur fichier CSV
    Par Mouadlib dans le forum Langage
    Réponses: 2
    Dernier message: 17/12/2009, 09h33
  3. symbole decimal sur fichier CSV
    Par looping dans le forum Langage
    Réponses: 3
    Dernier message: 19/01/2009, 12h06
  4. Ecriture sur fichier csv
    Par PIMPMAX dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 09/01/2007, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo