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

Calcul scientifique Python Discussion :

Mettre le contenu d'un tableau dans un fichier csv


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau Candidat au Club
    Mettre le contenu d'un tableau dans un fichier csv
    Bonjour,

    Je suis actuellement sur un projet ou je dois récupérer un signal issu d'un GBF (Sinus 1OOHz, 2Vpp) avec une carte National Instruments NI USB-6366

    J'utilise pour cela le package python fluidlab: https://fluidlab.readthedocs.io/en/l...est/index.html qui le permet en une seule commande de faire une acquisition et de mettre les données dans une variable comme suivant:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    data1, = read_analog('dev1/ai0', terminal_config='Diff',volt_min=-10, volt_max=10, samples_per_chan=N,sample_rate=sampling, coupling_types='DC')

    (notez que N=10000 et sampling=10e3)

    Je me retrouve donc avec une variable data1 de type float64 de taille (10000,) qui contient toutes mes données dans une tableau (avec l'explorateur de variables de mon IDE Spyder je vois une extrait des données array([ 0.48068259, 0.42349704, 0.36537403, ..., 0.62786508, 0.57817927, 0.52505608])

    Ma variable est tout a fait fonctionnelle, je peut l'afficher dans la console avec matplotlib et numpy:


    Mon problème est donc de mettre le contenu ce cette variable dans un fichier csv pour pouvoir importer et traiter les données sous d'autres logiciels comme Matlab.
    J'ai essayé avec ce code la:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    with open ("grafsin.csv","wb") as f:
        writer = csv.writer(f)
        writer.writerows(data1)


    mais ça ne marche pas, la console me sort Error: sequence expected au niveau de la ligne: writer.writerows(data1)

    Merci d'avance pour votre aide

    Ruby Smith.

    PS: je met mon code entier si besoin

    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
    # -*- coding: utf-8 -*-
    """
    Created on Wed Apr 24 16:32:19 2019
     
    @author: RG259588
    """
     
    from fluidlab.instruments.daq.daqmx import read_analog
     
    import numpy as np
    import matplotlib.pyplot as plt
    import csv
     
     
    N=10000 #Sampless
    sampling=10e3 #Sample rate
    #data1,data2, = read_analog(('dev1/ai0','dev1/ai1'), terminal_config='Diff',volt_min=-10, volt_max=10, samples_per_chan=N,sample_rate=sampling, coupling_types='DC', output_filename =None)
    data1, = read_analog('dev1/ai0', terminal_config='Diff',volt_min=-10, volt_max=10, samples_per_chan=N,sample_rate=sampling, coupling_types='DC')
    plt.figure()
    plt.clf()
    t=np.arange(N)/sampling
    plt.plot(t,data1)
    #plt.plot(t,data2)
    plt.show()
     
    #map(int,list(str(data1))
    #
    ##mon_fichier = open("graphsin.txt", "w")
    ##mon_fichier.write(data1)
    ##mon_fichier.close()
    #
    #
    with open ("grafsin.csv","wb") as f:
        writer = csv.writer(f)
        writer.writerows(data1)

  2. #2
    Expert éminent sénior
    Salut,

    Un fichier CSV est une structure à deux dimensions (des lignes et des colonnes) et c'est ce qu'attend .writerows.
    Or votre tableau n'a qu'une seule dimension... .writerow devrait fonctionner.

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

  3. #3
    Nouveau Candidat au Club
    Bonjour, merci pour votre réponse rapide,

    Je ne comprend pas trop du coup, mon variable possède & colonne et 10000 lignes, j'ai donc bien un tableau a deux dimensions ?
    Sinon existe t'il une commande pour que je puisse remplir ma colonne ?

  4. #4
    Nouveau Candidat au Club
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Un fichier CSV est une structure à deux dimensions (des lignes et des colonnes) et c'est ce qu'attend .writerows.
    Or votre tableau n'a qu'une seule dimension... .writerow devrait fonctionner.

    - W
    Ah, je viens de comprendre c'est une histoire de pluriel.
    Je viens de tester ça marche a moitié, Python m'a tous mis sur la case A1 sur excel, comment pourai-je faire pour avoir chaque chiffre dans une nouvelle ligne (A1, A2, A3...ect) ?

  5. #5
    Expert éminent sénior
    Citation Envoyé par Ruby Smith Voir le message
    Je viens de tester ça marche a moitié, Python m'a tous mis sur la case A1 sur excel, comment pourai-je faire pour avoir chaque chiffre dans une nouvelle ligne (A1, A2, A3...ect) ?
    Python n'écrit que le fichier CSV pas la case A1 d'EXCEL!

    Après si vous voulez avoir N lignes à la place de N colonnes, vous pouvez faire une boucle, transposer votre tableau,...

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

  6. #6
    Nouveau Candidat au Club
    Merci pour votre aide,

    J'ai pu adapter mon code 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    # -*- coding: utf-8 -*-
    """
    Created on Wed Apr 24 16:32:19 2019
     
    @author: RG259588
    """
     
    from fluidlab.instruments.daq.daqmx import read_analog
     
    import numpy as np
    import matplotlib.pyplot as plt
    import csv
     
     
    N=1000 #Sampless
    sampling=10e3 #Sample rate
     
    #data1,data2, = read_analog(('dev1/ai0','dev1/ai1'), terminal_config='Diff',volt_min=-10, volt_max=10, samples_per_chan=N,sample_rate=sampling, coupling_types='DC', output_filename =None)
    data1, = read_analog('dev1/ai0', terminal_config='Diff',volt_min=-10, volt_max=10, samples_per_chan=N,sample_rate=sampling, coupling_types='DC')
     
    plt.figure()
    plt.clf()
    t=np.arange(N)/sampling
    plt.plot(t,data1)
    #plt.plot(t,data2)
    plt.show()
     
     
    with open ("grafsin.csv","w") as f:
        writer = csv.writer(f)
        for i in range (0,1000):
            writer.writerow("'"+str(data1[i])) # le ' pour qu'excel n'interprète pas la donnée comme une formule


    Les donnés se mettent dans dans le tableau mais sous un format étrange:
    ',-,0,.,6,4,7,0,9,1,1,7,4,0,4,7 alors que je devrai avoir idéalement ça: '-0.647091174047
    Avez vous une idée de l'origine du problème ?
    Il y a également un second petit problème: chaque chiffre est espacé par une case vide...


  7. #7
    Expert éminent sénior
    Salut,

    Citation Envoyé par Ruby Smith Voir le message
    Les donnés se mettent dans dans le tableau mais sous un format étrange:
    ',-,0,.,6,4,7,0,9,1,1,7,4,0,4,7 alors que je devrai avoir idéalement ça: '-0.647091174047
    Avez vous une idée de l'origine du problème ?
    .writerow, comme son nom l'indique écrit une ligne de votre fichier CSV, çàd N colonnes séparées par ',' (par défaut)... donc il va découper la séquence que vous lui passer pour en faire des colonnes:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import csv
    >>> import sys
    >>> writer = csv.writer(sys.stdout)
    >>> writer.writerow('abc')
    a,b,c
    7
    >>>

    Et lorsque le nombre de colonnes se réduit à 1, on ne peut pas faire:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> writer.writerow(123.456)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    _csv.Error: sequence expected
    >>>

    ou bricoler en essayant de s'en sortir avec:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> writer.writerow(str(123.456))
    1,2,3,.,4,5,6
    15
    >>>


    Citation Envoyé par Ruby Smith Voir le message
    Il y a également un second petit problème: chaque chiffre est espacé par une case vide...
    Ah ben, avant d'utiliser le module CSV, il faut ouvrir le mode d'emploi et le lire...

    Ceci dit, pour créer un fichier à partir d'un tableau à une seule dimension avec une seule valeur par ligne, pas la peine d'utiliser le module CSV.

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

  8. #8
    Nouveau Candidat au Club
    Merci beaucoup, je viens de comprendre.

    J'ai pus rectifier le tir en faisant:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     mon_fichier = open("graphsin.csv", "w")
    for i in range (0,1000):
        mon_fichier.write(str(data1[i]) + "\n")
    mon_fichier.close()


    mes données sont bien en forme.
    Je voudrait maintenant rajouter le temps correspondant à chaque tension pour tracer ma sinusoïde.
    Il est stocké dans une variable "t" de même type, il faudrait donc que j'arrive a le mettre dans la colonne d’accoté.

    J'ai essayé avec ça:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon_fichier = open("graphsin.csv", "w")
    for i in range (0,1000):
        mon_fichier.writes(str(t[i]) + "\n",str(data1[i]) + "\n")
    mon_fichier.close()


    mais on dirait que writes n’existe pas, je reçoit l'erreur suivante: AttributeError: 'file' object has no attribute 'writes'

    Je commence le python donc j'ai encore du mal avec tous les concept...

  9. #9
    Expert éminent sénior
    Citation Envoyé par Ruby Smith Voir le message
    mais on dirait que writes n’existe pas, je reçoit l'erreur suivante: AttributeError: 'file' object has no attribute 'writes'

    Je commence le python donc j'ai encore du mal avec tous les concept...
    Ouvrir un tuto. ou la documentation pour avoir ce qu'on peut faire avec un fichier, regarder à quoi ressemble le fichier "csv" que vous voulez construire,...
    si vous ne prenez pas le temps de débuter... i.e prendre un peu des repères, on ne peut pas le faire à votre place.

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

###raw>template_hook.ano_emploi###