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 :

Liste de dict => CSV : Tout s'écrit dans la meme ligne/cellule


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Par défaut Liste de dict => CSV : Tout s'écrit dans la meme ligne/cellule
    Bonjour,

    J'essaie d'exporter une liste de dictionnaires dans un fichier CSV. J'ai regardé un nombre incommensurables de tutos avec relativement à chaque fois les mêmes procécédes mais.. ave cmoi ca ne marche pas

    Voici mon Excel :

    Nom : Capture.JPG
Affichages : 316
Taille : 96,0 Ko

    Ici, je souhaites mettre dans les colonnes les keys() pourtant elels restent dans la meme cellulle et quand je les print je n'ai aucun soucis :

    dict_keys(['Index', 'Date-Time', 'CN ASA', 'Filter', 'LNA', 'Polarisation', 'Azimuth', 'Span', 'Frequency min', 'Frequency max', 'Attenuator', 'Sweeptime', 'Ref Level', 'RBW', 'VBW', 'Scale', 'Frequency', 'Trace 1', 'Trace 2', 'Trace 3', 'Trace 4', 'Mark X 1', 'Mark Y 1', 'Mark X 2', 'Mark Y 2', 'Mark X 3', 'Mark Y 3', 'Mark X 4', 'Mark Y 4', 'Mark X 5', 'Mark Y 5', 'Mark X 6', 'Mark Y 6', 'Comment'])

    Voici mon code :

    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
    def export_to_csv(self):
            # Load json file
     
            # Creater an itemgetter.
            # . This will facilitate getting the values of our keys (aka headers)
     
            self.val = self.jsonlist.values()
            #values = itemgetter(*self.data)
     
            with open("./data/" + self.name_project + '.json', 'r') as file:
                self.dataTab = []
                self.jsonlist = json.load(file)
                self.dataTab = self.jsonlist['Test']
                self.data = self.jsonlist.keys()
     
     
     
     
            fileName, selectedFilter = QtGui.QFileDialog.getSaveFileName(self, "Save",
                                                                         f"F:/python/csv/{self.name_project}.csv", "Excel (*.csv *.xls )")
     
            keys = self.dataTab[0].keys()
            print(keys)
            with open(fileName, 'w', newline='') as output_file:
                #writer = csv.writer(output_file)
                #writer.writerow(keys)
                dict_writer = csv.DictWriter(output_file, fieldnames=keys) #dialect='excel'
                dict_writer.writeheader()
                # for key in self.dataTab:
                #      dict_writer.writerow(key)
    Merci pour votre temps
    Alexis

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Ton code est illisible. Ce n'est pourtant pas ton premier topic, tu le sais qu'on met son code entre balises, surtout en Python où l'indentation est super importante.

    Sinon à mon avis, ce n'est pas un souci d'affichage des clefs mais de les écrire dans un formalisme où Excel comprendra qu'il faut les séparer dans des colonnes. Donc déjà moi je commencerais par tester (à la main, via un blocnote) différents formalismes de CSV (avec virgule, point-virgule, etc) jusqu'à ce que Excel puisse ouvrir le fichier correctement.
    Et une fois trouvé, il ne resterait qu'à écrire le code en Python qui génère le bon format.

    [edit]Ca y est, le code est bien enregistré, on peut le lire. Donc zoom61 a trouvé le souci.
    Je rajoute juste qu'on peut remplacer with open("./data/" + self.name_project + '.json', 'r') as file par with open("data/%s.json" % self.name_project, 'r') as file ce qui n'est peut-être pas plus lisible mais au moins plus souple.
    Ensuite avec os.path (qui est portable donc qui adapte son séparateur à l'OS) ça donne with open(os.path.join("data", "%s.json" % self.name_project), 'r') as file. Et avec pathlib, son successeur, cela donne with open(pathlib.Path("data", "%s.json" % self.name_project), 'r') as file.
    Et tu n'es peut-être pas obligé de tout mettre en self si les variables ne sont pas destinées à être utilisées dans l'objet (self.data=..., self.dataTab=..., etc...).
    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
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 430
    Billets dans le blog
    11
    Par défaut
    Bonjour,

    Le format CSV pour Excel a comme délimiteur le ";", et pas la ",".
    Il te suffit d'ouvrir ton fichier CSV avec un éditeur de texte de remplacer "," par ";", ensuite l'ouvrir avec Excel.

    Cdlt.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Octobre 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Octobre 2020
    Messages : 9
    Par défaut
    Merci pour vos réponses

    @Sve@r En effet, désolé j'ai complètement oublié les balises

    @zoom61 C'est ca mon soucis, j'ai changé à la mano et ca fonctionne. Y a t'il un moyen par le code pour changer cela?

    Je suis passé par une autre méthode, en utilisant un delimiter. Mais, je n'utilise plus csv.DictWriter mais csv.writer. Est ce grave ? Y a t'il un changement dans le fichier csv ?

    Code Python : 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
     
    def export_to_csv(self):
    # Load json file
     
    # Creater an itemgetter.
    # . This will facilitate getting the values of our keys (aka headers)
     
    self.val = self.jsonlist.values()
    #values = itemgetter(*self.data)
     
    with open("./data/" + self.name_project + '.json', 'r') as file:
         self.dataTab = []
         self.jsonlist = json.load(file)
         self.dataTab = self.jsonlist['Test']
         self.data = self.jsonlist.keys()
     
     
     
     
    fileName, selectedFilter = QtGui.QFileDialog.getSaveFileName(self, "Save",
    f"F:/python/csv/{self.name_project}.csv") # "Excel (*.csv *.xls )"
     
    keys = self.dataTab[0].keys()
    print(keys)
    with open(fileName, 'w', newline='') as output_file:
         writer = csv.writer(output_file, delimiter = ';')
         writer.writerow(keys)
    #dict_writer = csv.DictWriter(output_file, fieldnames=keys) #dialect='excel'
    #dict_writer.writeheader()
    # for key in self.dataTab:
    # dict_writer.writerow(key)

    Si derrière je peux utiliser writerows() pour écrire les values de mes keys, c'est parfait.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 742
    Par défaut
    Salut,

    Citation Envoyé par AlexisM31 Voir le message
    Je suis passé par une autre méthode, en utilisant un delimiter. Mais, je n'utilise plus csv.DictWriter mais csv.writer. Est ce grave ? Y a t'il un changement dans le fichier csv ?
    Positionner le delimiter à ';' (plutôt qu'avoir la valeur par défaut = ',') aurait suffit (et s'applique aussi au DictWriter).
    Vous auriez aussi pu dire à EXCEL que le délimiteur était ','....

    Ce qui est "grave", c'est de partir sur une idée et plutôt que chercher à comprendre en faire fonctionner une autre: c'est du code gribouille où ça fonctionne prime à la compréhension du code qu'on écrit (et pourquoi on fait comme ça plutôt qu'autrement).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AlexisM31 Voir le message
    Je suis passé par une autre méthode, en utilisant un delimiter. Mais, je n'utilise plus csv.DictWriter mais csv.writer. Est ce grave ?
    C'est comme si tu disais "j'ai un tableau à écrire dans un fichier mais au lieu d'utiliser file.writelines() qui écrirait tout le tableau d'un coup je préfère boucler sur chaque ligne du tableau et écrire la ligne via file.write(). Est-ce grave?"
    csv.DictWriter() est spécialement dédié à écrire un dictionnaire. Il possède une méthode header() qui écrit les clefs (qui deviennent généralement les en-têtes de colonnes). Mais csv.writer() peut faire aussi le job. A toi alors d'écrire les clefs quand tu le sens.

    Citation Envoyé par AlexisM31 Voir le message
    Y a t'il un changement dans le fichier csv ?
    Non, pourquoi y en aurait-il? Il est quasiment certain que csv.DictWriter hérite de csv.writer donc les méthodes communes aux deux (ex writerows()) font la même chose (l'héritier utilisant probablement la méthode de son ancètre).

    Citation Envoyé par AlexisM31 Voir le message
    Si derrière je peux utiliser writerows() pour écrire les values de mes keys, c'est parfait.
    Ben voilà.
    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. [CSV] Constuire une liste déroulante depuis un csv
    Par kervano dans le forum Langage
    Réponses: 1
    Dernier message: 09/06/2009, 14h00
  2. Réponses: 3
    Dernier message: 28/04/2009, 00h42
  3. Liste chainée j'ai pas tout compris
    Par SPACHFR dans le forum Débuter
    Réponses: 4
    Dernier message: 13/03/2009, 16h30
  4. Réponses: 5
    Dernier message: 17/10/2008, 09h33
  5. [MySQL] Listes déroulantes et "All" sélectionne TouT
    Par DeTeR dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/09/2008, 22h06

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