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

  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 840
    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 840
    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 840
    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 840
    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

  12. #12
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     def stockage_csv(self):
                    cw = csv.writer(open('graphes.csv','w'), dialect='Unix', 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()
    Bonsoir à tous. J'ai toujours des problèmes que je n'arrive pas à résoudre avec cette fonction :
    1. si je laisse cw.close(), j'ai le message d'erreur suivant :

    AttributeError: '_csv.writer' object has no attribute 'close'

    Normalement, j'imagine qu'avec cw.close() je devrais pouvoir fermer le fichier csv une fois que toutes les écritures sont faites.

    2. si j'enlève cw.close(), le fichier graphes.csv est créé, je peux y écrire mais je n'ai pas les résultats attendus en faisant une édition dans excel. Par exemple pour un graphe de 3 sommets a, b, c et 3 arcs (a,b), (a,c), (b,a), j'obtiens dans excel les résultats suivants :
    a _
    b _
    c _
    a a
    a b
    a c
    b a
    b b
    b c
    c a
    c b
    c c

    alors que j'attends :
    a _
    b _
    c _
    a b
    b a
    a c

    Le problème, sans doute, se situe au niveau des boucles (for ... in). Pouvez-vous me suggérer des codes plus adéquats. Je vous remercie d'avance pour vos réponses.

  13. #13
    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,
    Problème avec close
    La réponse est simple, tu peux vérifier dans les méthodes de csv, il ne doit pas y avoir de "close" associés à un objet csv.
    "Tu peux fermer uniquement un objet fichier. Tu dois donc décomposer ton écriture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                fw=open('some.csv', 'wb')
                writer = csv.writer(fw,delimiter=';')

    Sortie non conforme
    , he bien je te propose d'utiliser des print pour faire afficher les éléments afin de trouver ce qui n'est pas dans le bon ordre.

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par selver057 Voir le message
    2. si j'enlève cw.close(), le fichier graphes.csv est créé, je peux y écrire mais je n'ai pas les résultats attendus en faisant une édition dans excel. Par exemple pour un graphe de 3 sommets a, b, c et 3 arcs (a,b), (a,c), (b,a), j'obtiens dans excel les résultats suivants :
    a _
    b _
    c _
    a a
    a b
    a c
    b a
    b b
    b c
    c a
    c b
    c c

    alors que j'attends :
    a _
    b _
    c _
    a b
    b a
    a c

    Le problème, sans doute, se situe au niveau des boucles (for ... in). Pouvez-vous me suggérer des codes plus adéquats. Je vous remercie d'avance pour vos réponses.
    Salut

    Concernant ton graphe de 3 sommets a, b, c et 3 arcs (a,b), (a,c), (b,a), peux-tu repréciser comment sont stockés tes sommets et tes arcs en mémoire STP ???
    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]

  15. #15
    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,

    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
     def stockage_csv(self):
                    cw = open('graphes.csv','w')
                    writer = csv.writer(cw, dialect='Unix', delimiter=';')
                    for nouv_som in self.sommet:
                            ligne = [nouv_som,'_']
                            writer.writerow(ligne)
                    for ext_ini in self.sommet:
                            for ext_fin in self.sommet:
                                    a = self.sommet.index(ext_ini)
                                    b = self.sommet.index(ext_fin)
                                    if b in self.succ[a]:
                                             ligne = [ext_ini,ext_fin]
                                             writer.writerow(ligne)
                                    else:
                                             ligne = []
    Cette fois-ci la fonction me donne les résultats que j'attends. Soit pour un graphe de 3 sommets a, b et c et de 3 arcs (a,b), (a,c), (b,a), après écriture dans le fichier graphes.csv, et édition dans excel, j'obtiens bien le résultat:
    a _
    b _
    c _
    a b
    a c
    b a

    Seule petite difficulté restante : je n'arrive pas à fermer le fichier graphes.csv après écriture. Quelqu'un a-t-il une/des idée(s)?

    @ Sve@r : voir message du 15.10.2011
    1. avec la fonction ajouterSommet, chaque nom de sommet est associé à la variable nouv_som
    2. avec la fonction ajouterArc, chaque extrémité initiale est associée à la variable ext_ini et chaque extrémité finale, à la variable ext_fin.
    3. en exécutant la fonction stockage_csv, un fichier csv (graphes.csv) est créé et enregistre grâce à la méthode writer le nom de chaque sommet ainsi que chaque arc défini. Ce fichier csv peut être édité par excel ou office calc ce qui permet d'avoir de créer différents graphes puis de les stocker (enregistrer) dans excel (ou office calc).

    Je ne sais pas si ce sont les réponses que tu attendais, tu me laisseras savoir dans ton prochain post.

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par selver057 Voir le message
    @ Sve@r : voir message du 15.10.2011
    1. avec la fonction ajouterSommet, chaque nom de sommet est associé à la variable nouv_som
    2. avec la fonction ajouterArc, chaque extrémité initiale est associée à la variable ext_ini et chaque extrémité finale, à la variable ext_fin.
    3. en exécutant la fonction stockage_csv, un fichier csv (graphes.csv) est créé et enregistre grâce à la méthode writer le nom de chaque sommet ainsi que chaque arc défini. Ce fichier csv peut être édité par excel ou office calc ce qui permet d'avoir de créer différents graphes puis de les stocker (enregistrer) dans excel (ou office calc).

    Je ne sais pas si ce sont les réponses que tu attendais, tu me laisseras savoir dans ton prochain post.
    Salut

    Ca va. Le pb c'est qu'il y avait beaucoup de posts et que j'avais perdu le fil. Mais bon, puisque tu as réussi à t'en sortir tout seul...

    Concernant ton pb de fermeture, il te faut fermer le fichier. Voici le principe de base de toute écriture dans un fichier: on ouvre, on écrit, on ferme
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cw=open(nom, mode)
    cw.write(...)
    cw.close()
    Ceci répond d'ailleurs à ta question du 01/11 à savoir si tu peux compacter l'écriture en cw = csv.writer(open("some.csv",'w')) et non tu ne peux pas car si tu ne récupères pas le descripteur renvoyé par open(), tu n'as rien pour fermer ton fichier.

    Et, autre réponse tardive (j'avais décroché de ce fil) à ta question sur "wb" il s'agit du mode d'ouverture. Le fichier est ouvert en mode "w" (write) et "b" (binaire). Le "b" est une spécificité windows pour indiquer au système de ne rien transformer de ce qu'il écrit. Parce que sous windows, quand on écrit du texte "humanisé" (avec des lignes etc), chaque fin de ligne symbolisée par <enter> est écrite sous forme de 2 caractères "\r\n". Donc par défaut (toujours sous windows), tout caractère ascii 13 est écrit sous forme de 2 caractères. Ce qui pose problème si on veut écrire un fichier binaire comme un mp3 ou un jpeg et où le caractère 13 doit rester tel quel. Donc dans ce cas, il faut spécifier explicitement "b" pour demander à ce qu'il n'y ait pas transformation.
    Dans les environnements types posix (Unix/Linux), le "b" est inutile car il n'y a pas transformation. Le caractère ascii 13 est écrit tel quel et s'il s'agit d'un fichier texte, l'éditeur de texte sait le lire et peut l'ouvrir correctement. Bref encore une fois, merci aux développeurs zindow d'avoir compliqué les choses à plaisir.

    Toutefois, toi qui écris un fichier CSV (donc dédié à la base à l'humain ou au-moins à pouvoir aussi être lu par des éditeurs de textes classiques), il ne te faut pas mettre "wb" mais simplement "w". Ainsi ton CSV sera écrit dans un format à la fois lisible par Excel et à la fois lisible par un éditeur style notepad...
    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]

  17. #17
    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,

    Merci beaucoup pour toutes tes explications. Si tu regardes le post 15 tu verras que j'ai réécrit toute la fonction, et que je l'ai décomposée (sur conseil d'alexdevl qui intervient également dans la discussion) pour pouvoir fermer le fichier csv. Je te remets la fonction pour t'éviter d'aller rechercher dans les précédents post :

    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
    def stockage_csv(self):
                    cw = open('graphes.csv','w')
                    writer = csv.writer(cw, dialect='Unix', delimiter=';')
                    for nouv_som in self.sommet:
                            ligne = [nouv_som,'_']
                            writer.writerow(ligne)
                    for ext_ini in self.sommet:
                            for ext_fin in self.sommet:
                                    a = self.sommet.index(ext_ini)
                                    b = self.sommet.index(ext_fin)
                                    if b in self.succ[a]:
                                             ligne = [ext_ini,ext_fin]
                                             writer.writerow(ligne)
                                    else:
                                             ligne = []
                     cw.close()
    Je l'ai testé de nouveau et j'ai le message d'erreur suivant :
    NameError: global name 'csv' is not defined
    Franchement, je ne comprends plus rien. Que faire?

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par selver057 Voir le message
    Je l'ai testé de nouveau et j'ai le message d'erreur suivant :
    NameError: global name 'csv' is not defined
    Franchement, je ne comprends plus rien. Que faire?
    As-tu laissé le "import csv" ???

    Ps: ta variable "ligne" ne sert pas à grand chose dans ta fonction. Ni a et b (sauf à rendre le code plus lisible)

    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
    def stockage_csv(self):
    	cw = open('graphes.csv','w')
    	writer = csv.writer(cw, dialect='Unix', delimiter=';')
    	for nouv_som in self.sommet:
    		writer.writerow([nouv_som,'_'])
     
    	for ext_ini in self.sommet:
    		for ext_fin in self.sommet:
    			if self.sommet.index(ext_fin) in\
    			self.succ[self.sommet.index(ext_ini)]:
    				writer.writerow([ext_ini,ext_fin])
    		# for
    	# for
    	cw.close()
    # stockage_csv()
    Et je pense même qu'on peut remplacer les liste [] par des tuples () plus économiques en ressources => writer.writerow((ext_ini,ext_fin))
    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]

  19. #19
    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 fichiers csv
    Bonjour, bonne nouvelle je suis arrivé à trouver ce qui ne marchait pas dans la fonction stockage_csv dont la version finale est comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     def stockage_csv(self, nom_fichier):
                    cw = csv.writer(open(nom_fichier,'w'), dialect = 'unix', 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:
                                    a = self.sommet.index(ext_ini)
                                    b = self.sommet.index(ext_fin)
                                    if b in self.succ[a]:
                                             ligne = [ext_ini,ext_fin]
                                             cw.writerow(ligne)
                                    else:
                                             ligne = []
    Comme le dit Sve@r dans un précédent post, les variables "lignes", "a" et "b", ne sont pas vraiment nécessaires mais je préfère les laisser pour faciliter la lisibilité du code. J'ai créé un menu contenant les appels suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nom_fichier = str(raw_input("Entrez un nom de fichier en y ajoutant l'extension csv : "))
    self.stockage_csv(nom_fichier)
    ce qui me permet de nommer différemment chaque fichier csv que je crée depuis le menu, grâce notamment au paramètre "nom_fichier".
    Je me demandais s'il est possible de faire le chemin inverse, c'est à dire, récupérer des données sur un graphe (sommets et arcs) à partir d'un fichier csv (ou un fichier quelconque). En somme, je cherche maintenant à exploiter la méthode csv.reader. Aussi, peut-on appliquer un parcours en largeur à mon algorithme? Merci de me faire parvenir vos suggestions/réponses.

  20. #20
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par selver057 Voir le message
    Comme le dit Sve@r dans un précédent post, les variables "lignes", "a" et "b", ne sont pas vraiment nécessaires mais je préfère les laisser pour faciliter la lisibilité du code.
    Ok. Mais au-moins vire le else: ligne = [] plus qu'inutile ...

    Citation Envoyé par selver057 Voir le message
    Je me demandais s'il est possible de faire le chemin inverse, c'est à dire, récupérer des données sur un graphe (sommets et arcs) à partir d'un fichier csv (ou un fichier quelconque). En somme, je cherche maintenant à exploiter la méthode csv.reader. Aussi, peut-on appliquer un parcours en largeur à mon algorithme? Merci de me faire parvenir vos suggestions/réponses.
    Oui, pas de pb.
    En partant d'un fichier contenant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a _
    b _
    c _
    a b
    a c
    b a
    On peut le parser de cette façon
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    arbre={}
    fp=open(fichier, "r")
    for line in fp:
        (sommet, lien)=line.replace("\n", "").split(" ")
        if sommet not in arbre.keys():
            arbre[sommet]=[]
        if lien != "_":
            arbre[sommet].append(lien)
    # for
    fp.close()
    Ce qui donne au final le dico suivant:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    arbre={
        "a" : [ "b", "c" ],
        "b" : [ "a" ]
        "c" : [],
    }
    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]

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