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 :

Problème de création d'un CSV grâce à DictWriter


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2019
    Messages : 11
    Par défaut Problème de création d'un CSV grâce à DictWriter
    Bonjour à tous.

    Je rencontre un petit problème pour écrire un fichier CSV à partir de python. Il s'agit d'un travail sur des données contenant des données d'observation d'espèces animales sur plusieurs communes

    Mon script doit normalement enfermer des informations à écrire dans un dictionnaire (nommé dico 2).

    Puis ce dico est transmis à un objet DictWriter pour qu'il l'écrive dans un fichier. Une boucle permet d'écrire plusieurs lignes successives.

    Le script est le suivant:

    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
    # usr/bin/python
     
    import csv
     
    global dico,  listeEspeces, coefSeuil,  dico2
    dico = {}                                   
    dico2 = {}
    listeEspeces = []
    coefSeuil  = 0.95
     
    def listeEspeceDico(ligne):
        """traitement des lignes transmises en entrée"""
        for e in ligne[2].split(' - '):
            if e not in listeEspeces: #si l'espèce rencontrée n'est pas déjà dans la liste, on l'ajoute
                listeEspeces.append(e)
        dico[ligne[1]] = len(listeEspeces)  #création d'un dico contenant une date et une espèce observée
        return dico
     
    ###Main###
     
    with open('filetest.csv', 'r') as f: #ouverture et lecture du fichier source
        lecture = csv.reader(f, delimiter=',')
        communeActuelle = ''
     
        for ligne in lecture: #lecture de la commune contenue dans la présente ligne
            nouvelleCommune = ligne[0]
            if communeActuelle == '':
                communeActuelle = nouvelleCommune
     
            if communeActuelle == nouvelleCommune: #bouclage si la commune est toujours la même
                listeEspeceDico(ligne)
                continue
     
            else:  #tout foire à partir de ce bloc
                nbJr = 0
                for cle in dico: #on recherche la date à partir de laquelle               
                    nbJr += 1    #on a observé 95% des especes
     
                    if dico[cle] >= coefSeuil*len(listeEspeces):
                        dico2['commune'] = communeActuelle    #puis on crée un dico contenant
                        dico2['nbJrSeuil'] = nbJr             #commune et nb de jour d'observation
     
                with open('sortie.csv', 'a', encoding = 'utf-8') as f: #Ouverture du fichier destination
                    fieldnames = ['commune', 'nbJrSeuil']
                    writer = csv.DictWriter(f, fieldnames=fieldnames)
                    writer.writerow(dico2)   #écriture des infos de dico2 dans le csv
     
                dico = {}   #remise à 0 des variables pour un nouveau tour de boucle
                listeEspeces = []
                communeActuelle = nouvelleCommune  #on précise au programme qu'on change de commune
                listeEspeceDico(ligne)
    Le programme ne renvoi pas le nombre de lignes annoncées. La ou je dois normalement avoir 3 lignes avec: "Commune" et "nb de jours"

    commune nbJrSeuil

    1 3

    2 4

    3 4

    J'obtiens deux lignes avec le mauvais nombre de jours

    commune nbJrSeuil

    1 4

    2 4

    J'ai fais un grand nombre de test, mais je ne situe toujours pas le problème..

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

    Un affichage de dico2 (via print) avant de l'écrire dans le fichier vous permettrait de vérifier que vous récupérez dans le fichier ce que vous y avez écrit (ou pas) et mieux cerner le problème.

    Pour le reste, je trouve que ce n'est pas une bonne idée de mélanger lecture et écritures dans la même boucle. Il serait plus simple de créer une fonction qui lit le fichier d'entrée et qui mette les informations au format attendu et une autre fonction qui écrive ces données dans le fichier de sortie.
    Cela aurait pour avantage de mettre au point les 2 opérations indépendamment l'une de l'autre.

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

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2019
    Messages : 11
    Par défaut
    Bonjour, et merci pour votre message.

    J'ai résolu la plus grande partie du problème. Je vais essayer d'améliorer le programme dans le sens que vous proposez.

    La seule question que je me pose, c'est comment formater les données? Je sais que je dois passer un dictionnaire à DictWriter.
    Mais étant donné que j'ai environ 140 000 lignes en entrée, je me demande dans quelle structure de données je pourrais enregistrer cela.

    Qu'est ce qui serait le plus pratique pour cela? Une liste?

  4. #4
    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 Balibar Voir le message
    La seule question que je me pose, c'est comment formater les données? Je sais que je dois passer un dictionnaire à DictWriter.
    Si vous devez passer un dict à csv.DictWriter, vous n'êtes pas obligé de passer par un DictWriter pour écrire un fichier CSV.

    Citation Envoyé par Balibar Voir le message
    Mais étant donné que j'ai environ 140 000 lignes en entrée, je me demande dans quelle structure de données je pourrais enregistrer cela.
    Des lignes et des colonnes, çà fait 2 dimensions... Une liste de tuples/listes est assez simple.... Et si vous êtes inquiet du nombre de lignes, "yield" permet de fabriquer un generateur pour récupérer chaque ligne à écrire.

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

Discussions similaires

  1. [XL-2013] Problème de création de boutons grâce a du code VBA
    Par Baldo32 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/11/2016, 17h07
  2. Réponses: 1
    Dernier message: 20/10/2005, 10h32
  3. Problème de création de table sous MySql
    Par ducamba dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2003, 09h59
  4. Problème de création de fenêtre
    Par tomateauketchup dans le forum DirectX
    Réponses: 1
    Dernier message: 08/06/2003, 19h42
  5. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07

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