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 :

probleme ecriture fichier csv


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut probleme ecriture fichier csv
    bonjour,
    ce n'est pas vraiment un bug, mais plutot mon ignorance qui me bloque, n'etant pas un pur programmateur (un peu d'indulgence, j'ai deja ecumé les docs en ligne!).

    Je veux ecrire des resultats de series temporelles dans un fichier .csv (pour etre exploité ensuite sous excel, par d'autres), sous le format suivant :

    dates;param1;param2,param3;param4 (...etc)

    l'argument de writerow(s), doit etre unique, et je ne sais pas comment reussir a mettre ces deux elements ; la date, et un tableau (de 4 elements sur une meme ligne) (le tableau seul oui). Voici l'extrait du code en question :

    programme ppal (pour info):
    tj_ord= np.arange(tj_deb,tj_fin+1)
    tj = num2date(tj_ord)
    ... ecr_serie_exu(tj,EXUT_C,iex,filepathgraph+filepathdate+'series/',filenamefich,PARA,infos)


    fonction en question :

    [I]def ecr_serie_exu(t,EXUT_C,iex,filepathfich,filenamefich,PARA,infos):

    with open(filepathfich+filenamefich+"_exu.csv","wb") as file:
    writer = csv.writer(file, delimiter=';',quoting=csv.QUOTE_MINIMAL)
    writer.writerow( PARA['abrev'] )
    for i in np.arange(0,len(t)):
    list=[t.strftime("%Y/%m/%d"),EXUT_C['FLUX_int'][iex][0:len(PARA),i]]
    writer.writerows(list)
    file.close()


    Par exemple ce dernier essai me met un ";" entre chaque chiffre de la date et va ensuite a la ligne pour afficher les valeurs.

    Ca fait une journée que je bloque sur cette question "formelle", malgre mes recherches sur internet. Quelle est l'astuce pour ecrire plusieurs "tableaux", sur une meme ligne ?
    je n'ai pas bien saisi non plus la difference entre writerow et writerows, qui ne sortent pas la meme chose ???

    Desolé pour ma longue question, j'espere que l'un de vous pourra m'orienter. Merci d'avance.
    Matthieu

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà un petit code qui devrait t'aider (Python 2.7):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import csv
     
    LL = [["date_0_0", "param_0_1", "param_0_2", "param_0_3"],
          ["date_1_0", "param_1_1", "param_1_2", "param_1_3"],
          ["date_2_0", "param_2_1", "param_2_2", "param_2_3"]
         ] 
     
    fichier = "monfichier.csv"
     
    with open(fichier, "wb") as fw:
        c = csv.writer(fw, delimiter=';', quotechar='"') #, quoting=csv.QUOTE_NONNUMERIC)
        for ligne in LL:
            c.writerow(ligne)
    Contenu du fichier csv:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    date_0_0;param_0_1;param_0_2;param_0_3
    date_1_0;param_1_1;param_1_2;param_1_3
    date_2_0;param_2_1;param_2_2;param_2_3
    Ce qui est accepté par Excel.

    Si ça ne te suffit pas: demande!

    [PS: pour afficher du code dans tes messages: utilise les tags de code: clique sur le '#' en haut et à gauche de la fenêtre d'édition du message.]

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 893
    Points : 7 249
    Points
    7 249
    Par défaut
    Salut Tyrtamos,

    Ce qui est accepté par Excel.
    On peut d'ailleurs en préciser le paramètre dialect selon ce qu'indique la documentation

    Bonne journée,

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    merci pour ta reponse (enfin vos!), je n'utilise pas "for ligne", mais voici ce que cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                list=[t[i].strftime("%Y/%m/%d"),EXUT_C['FLUX_int'][iex][0:len(PARA),i]]
                for ligne in list:
                    writer.writerow(ligne)
    resultat dans le fichier .csv :

    2;0;1;0;/;1;2;/;1;4
    18530.000000000004;651188.01843317982;6967.7419354838712;1402.6466165413535

    Si par contre j'ecris directement list

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            for i in np.arange(4000,4010):  #len(t)):
                list=[t[i].strftime("%Y/%m/%d"),EXUT_C['FLUX_int'][iex][0:len(PARA),i]]
    #            for ligne in list:
                writer.writerow(list)
    j'obtiens :

    2010/12/14;[ 18530. 651188.01843318 6967.74193548 1402.64661654]

    Dans le premier cas, il gere bien les valeurs du tableaux, separées par une virgule, mais les caracteres de la date aussi, dans le deuxieme, il affiche bien la date, mais par contre, le tableau est affiche comme un tableau.

    Le probleme est de creer la fusion des deux "tableaux", dont l'un est une chaine de caractere(la date), du genre :
    2011/01/01 val1 val2 val3 val4 ?

    ca parait trivial, mais je ne trouve aucun exemple sur le net, et je n'ai pas assez d'experience pour m'inspirer d'un autre langage.

    merci d'avance en tout cas

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour fred1599,

    Entièrement d'accord! Je voulais rester très simple, mais comme c'est pour Excel, ça vaut le coup de compléter. Voilà le code avec dialect (Python 2.7):

    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
    import csv
     
    #============================================================================
    class dialectexcel(csv.excel):
        """Profil pour les fichiers CSV avec Excel"""
        delimiter = ';'
        quotechar = '"'
        doublequote = True
        skipinitialspace = False
        lineterminator = '\r\n' # possibilité de '\n' pour Linux
        quoting = csv.QUOTE_MINIMAL
     
    csv.register_dialect('dialectexcel', dialectexcel)
     
    #============================================================================
    LL = [["date_0_0", "param_0_1", "param_0_2", "param_0_3"],
          ["date_1_0", "param_1_1", "param_1_2", "param_1_3"],
          ["date_2_0", "param_2_1", "param_2_2", "param_2_3"]
         ] 
     
    fichier = "monfichier.csv"
     
    with open(fichier, "wb") as fw:
        c = csv.writer(fw, dialect=dialectexcel)
        for ligne in LL:
            c.writerow(ligne)
    Ce qui donne, bien sûr, le même résultat. L'avantage est de faciliter les changements de configuration. On peut d'ailleurs avoir dans le même programme une classe pour la lecture et une pour l'écriture pour s'adapter aux différents cas de figures.

    Comme j'utilise pas mal les échanges csv-Excel, j'en profite pour signaler 3 problèmes qui ne sont pas traités ou insuffisamment dans la doc:

    - Nombres: même si on transmet un nombre en tant que chaine (avec guillemets), Excel le prend en tant que nombre: ce n'est pas toujours ce qu'on veut. Par exemple: les codes postaux sont reçus et affichés par Excel comme des nombres.

    - Nombres flottants: Lorsque Excel est configuré pour le français, il doit recevoir les nombres flottants avec virgules et non avec points. Dans l'écriture csv, il faudra donc remplacer les points par des virgules (nombre.replace('.',',')) et faire le contraire dans l'autre sens.

    - Encodage: le module csv (Python 2.7) ne fonctionne bien qu'avec utf-8. si on part d'un autre encodage pour la liste et pour le fichier, il faut passer par une conversion (module codecs) avec un fichier intermédiaire. Pour aller plus vite, on peut utiliser le module cStringIO. Il y a un embryon de solution dans la doc.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour fred1599,

    Entièrement d'accord! Je voulais rester très simple, mais comme c'est pour Excel, ça vaut le coup de compléter. Voilà le code avec dialect (Python 2.7):
    J'ai effectivement la version 2.7 sous windows (spyder), et j'ai vu la partie "dialect", mais mon probleme est en amont finalement !
    faut-il creer une liste avec les dates et les valeurs des parametres a la suite?

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par donkeyshot Voir le message
    faut-il creer une liste avec les dates et les valeurs des parametres a la suite?
    Tu as bien vu mon exemple: le fichier csv est construit à partir d'une "liste de listes": chaque sous-liste représente une ligne du fichier, et contient les éléments de chaque colonne de la ligne sous forme de chaines et de nombres à la queue leu leu (séparés par des virgules). Pour reprendre tes éléments avec la date dans la 1ère colonne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LL = [["2013/9/1", "param_0_1", "param_0_2", "param_0_3"],
          ["2013/9/8", "param_1_1", "param_1_2", "param_1_3"],
          ["2013/9/15", "param_2_1", "param_2_2", "param_2_3"]
         ]
    Si tu ne sais pas construire cette liste, dis-le, et, dans ce cas, dis à partir de quoi tu veux la créer (donne un exemple simplifié).

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Tu as bien vu mon exemple: le fichier csv est construit à partir d'une "liste de listes": chaque sous-liste représente une ligne du fichier, et contient les éléments de chaque colonne de la ligne sous forme de chaines et de nombres à la queue leu leu (séparés par des virgules). Pour reprendre tes éléments avec la date dans la 1ère colonne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LL = [["2013/9/1", "param_0_1", "param_0_2", "param_0_3"],
          ["2013/9/8", "param_1_1", "param_1_2", "param_1_3"],
          ["2013/9/15", "param_2_1", "param_2_2", "param_2_3"]
         ]
    Si tu ne sais pas construire cette liste, dis-le, et, dans ce cas, dis à partir de quoi tu veux la créer (donne un exemple simplifié).
    Et bien oui, je crois que c'est bien le "coeur" du probleme, j'essaie de creer une liste de liste contenant une chaine de caractere et les 4 parametres réels sur chaque ligne.
    Concretement, j'ai un "tableau" de dates au format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> tj[4500]
    datetime.datetime(2012, 4, 27, 0, 0, tzinfo=<matplotlib.dates._UTC object at 0x028D46D0>)
    >>> tj[4500].strftime("%Y/%m/%d")
    '2012/04/27'
     
    >>> EXUT_C['FLUX_int'][79][0:4,4500]
    array([  8.26666667e+02,   8.58000000e+04,   1.59600000e+03,
             8.22315789e+01])
    ces tableaux ont le meme nombre de ligne (i; indice temps), et je n'arrive pas a tout simplement les joindre dans un seul tableaux (je sais que je touche la a la question des listes de liste, peu claire pour moi)
    merci pour ta patience

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Essaie un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    imax = 5000 # mettre ici le nb maxi de lignes
    LL = []
    for i in xrange(0, imax):
        LL.append([])
        LL[i][-1].append(tj[i].strftime("%Y/%m/%d"))
        tableau = EXUT_C['FLUX_int'][79][0:4,i] 
        for x in tableau:
            elem = str(x).replace('.', ',')
            LL[i][-1].append(elem)
    # LL = la liste de listes à utiliser pour le fichier csv
    J'ai supposé que là où tu avais mis 4500, c'était un exemple de numéro de ligne

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup,
    j'ai essaye ton idée, dont je comprends le principe, mais visiblement l'indice "i" de LL (dans LL[i][-1] ne passe pas). C'est quand meme pas trivial de manipuler des tableaux dans python, gasp !

    Citation Envoyé par tyrtamos Voir le message
    Essaie un truc comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    imax = 5000 # mettre ici le nb maxi de lignes
    LL = []
    for i in xrange(0, imax):
        LL.append([])
        LL[i][-1].append(tj[i].strftime("%Y/%m/%d"))
        tableau = EXUT_C['FLUX_int'][79][0:4,i] 
        for x in tableau:
            elem = str(x).replace('.', ',')
            LL[i][-1].append(elem)
    # LL = la liste de listes à utiliser pour le fichier csv
    J'ai supposé que là où tu avais mis 4500, c'était un exemple de numéro de ligne

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    imax est supposé être le nombre total de lignes à lire (que je ne connais pas): qu'as-tu mis?

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Je n'ai pas mis 5000 (je fais de 4000 a 4002 par exemple), mais j'ai quand meme reussi a obtenir ce que je voulais avec ta methode, par contre, je ne vois pas d'exemple sur le net de liste à deux indices "LL[i][-1]", mais je m'en suis sorti comme cela en creant une list de liste a chaque ligne. Pour le titre, j'ai du utiliser "extend", pour qu'il supprime les crochets.

    Voici ma methode, copiée de la tienne, pour info (j 'ai vu qu'il valait mieux faire un del de liste), et merci pour l'aide !

    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
     
        with open(filepathfich+filenamefich+"_exu.csv","wb") as file:
            writer = csv.writer(file, dialect=dialectexcel)
            titre = ['dates']
            titre.extend(PARA['abrev'])        
            writer.writerow(titre) 
            for i in np.arange(4000,4002):  #len(t)):
                LL = []
                LL.append(t[i].strftime("%Y/%m/%d"))
                tableau = EXUT_C['FLUX_int'][iex][0:len(PARA),i]
                for x in tableau:
                    elem = str(x).replace('.',',')
                    LL.append(elem)          
                writer.writerow(LL)
                del(LL[:]) 
        file.close()
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    imax est supposé être le nombre total de lignes à lire (que je ne connais pas): qu'as-tu mis?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme lecture fichier CSV
    Par pi_hellz dans le forum Général Python
    Réponses: 2
    Dernier message: 03/03/2014, 01h26
  2. ecriture fichier CSV
    Par c+cool dans le forum Langage
    Réponses: 4
    Dernier message: 14/08/2008, 11h48
  3. [CSV] Probleme De Fichier
    Par stomerfull dans le forum Langage
    Réponses: 8
    Dernier message: 28/06/2006, 10h34
  4. Réponses: 19
    Dernier message: 15/05/2006, 15h02
  5. Réponses: 9
    Dernier message: 31/01/2006, 22h42

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