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 :

Sauvegarde de data csv


Sujet :

Python

  1. #1
    Invité
    Invité(e)
    Par défaut Sauvegarde de data csv
    Bonjour,
    je cherche à enregistrer dans un fichier des datas appartenant à différentes courbes.

    j'arrive à faire ce que je veux lorsque je considère 1 courbe via le code suivant:
    NB: ça écrit dans un csv toutes les valeurs contenues dans mes listes "self.x_save" et "self.y_save".
    Ces valeurs occupent autant de lignes du csv que de valeurs présentent dans chaque liste (et les valeurs x_save et y_save sont séparées par 1 "$").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fichier = open (self.ad_save,'w',newline='')
    ecriture=csv.writer(fichier,delimiter="$")
    ecriture.writerow(("Temps","Tension"))
     
    if self.nb_courbe==1:
         (self.x_save,self.y_save)=self.courbe1.getData()
         if len(self.x_save>2):
              for y in range(0,len(self.x_save),1):
                   ecriture.writerow((self.x_save[y],self.y_save[y]))
    Là où je commence à bloquer c'est que j'ai une dizaine de courbes qui peuvent être à enregistrer... et dont la taille (nombre de valeurs) ne sont pas forcément équivalent.
    j'aimerais éviter de faire autant de fichiers csv que de courbes... (j'aimerais pouvoir tous mettre dans 1 seul csv pour exploiter tout d'un coup dans 1 fichier).

    du coup, je ne sais pas comment structurer le code... boucler sur des listes de tailles variables pour coller les valeurs éventuellement vides dans un csv...
    je pense me lancer dans l'idée de prendre ma liste la plus grande et d'aligner toutes les autres sur cette même taille avec des champs vides (mais je trouve le code lourd... ou alors je ne m'y prends pas comme il faut).
    Globalement, j'aimerais avoir une sauvegarde qui structure les choses un peu comme ci dessous:

    valeur1$valeur2$valeur1a$valeur2a$valeur1b$valeur2b
    1$4$9$8$7$5
    4$5$8$7$1$3
    7$8$""$5$""$7
    4$5$""$7$""$6
    4$""$""$1$""$6
    ""$""$""$2$""$8

    avez vous des conseils?
    merci :-)

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 : 4 064
    Par défaut
    Bonjour,

    Là où je commence à bloquer c'est que j'ai une dizaine de courbes qui peuvent être à enregistrer... et dont la taille (nombre de valeurs) ne sont pas forcément équivalent.
    Quel est le nombre de valeurs dans votre courbe exemple ? Ça sera cette valeur qu'il faudra transformer en une variable python, dans une fonction par exemple...

    Surtout, comment peut-on connaître cette information ? Par exemple pour votre courbe exemple, comment avez-vous su que cette valeur représentait sa taille ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    pour le nombre de valeurs, ça peut aller de quelques unités... à plusieurs dizaines de milliers....
    En fait, le nombre de valeurs dépend du temps et de la fréquence d'échantillonnage de chaque conditions de mesures (et qui sont propre à chaque courbe que je trace en temps réel avec un lancement/arrêt que je choisis en fonction de ce qui se passe sur chaque courbe).
    Lors d'un arret, je stock l'ensemble des valeurs dans des listes et je relance éventuellement une seconde mesure qui se surimpose (graphiquement) à la précédente.

    Alors un coup, j'ai une courbe longue... puis une courte... puis une longue... et je veux pouvoir tout enregistrer si c'est nécessaire.

    dans mon "exemple", je vérifie si ma courbe contient quelque chose (en vérifiant que sa longueur est >2 parce que mes listes abscisses/ordonnées sont récupérées via le getData() inhérent aux appels type "Addplot.plot()" de pyqtgraph... qui me renvoient deux array: 1 pour x et l'autre pour y.

    Ainsi, si ma courbe est vide j'ai un getData() qui me renvoie (None,None).... d'où le "2" de mon exemple.

    Actuellement, je n'arrive pas à "formuler" quelque choses de correcte vis à vis des éventuelles concaténations nécessaires à la transcription de chaque liste (vide ou non) dans un fichier CSV (que je n'arrive à remplir que ligne par ligne).
    Dernière modification par Invité ; 06/03/2019 à 14h06.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 : 4 064
    Par défaut
    Ce code vient-il de toi ou est-ce du copié-collé ? Parce que si on peut faire pour une courbe, on peut faire pour plusieurs avec une boucle, non ?

    On peut aussi utiliser une fonction qui le fait pour une courbe, puis avec une boucle, exécuter la fonction sur n courbes. Je ne vois pas le problème, car tu sembles détecter la taille par len(self.x_save).

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est bien un code que j'ai bidouillé avec la doc! (c'est pas du copier coller).
    le problème, c'est pas vraiment la gestion des datas elles mêmes, j'arrive facilement à les affecter à des variables, à connaitre leurs tailles, à balayer tout ce qu'il faut, à les tracer en graphiques, à les effacer ou les surimposer sans problème.

    C'est juste la phase d'enregistrement/exportation (dans un csv) où je galère.
    en fait je n'arrive à gérer le csv qu'en lignes...

    exemple: j'ai 2 courbes que je veux enregistrer et qui sont déjà respectivement contenues dans les variables self.courbe1 et self.courbe2.
    je boucle sur self.boucle1 en fonction de sa taille et j'écris une nouvelle ligne dans le csv à chaque incrément d'index de liste.

    jusque là, ça marche nickel!!

    je prends maintenant mon self.courbe2.
    et là je sais pas comment m'y prendre... j'ai pas envie d'écrire directement à la suite des précédentes lignes parce que en traitement de donnée (plus tard sur excel), ça va être "chiant"...
    je préférerais concaténer le contenu des variables de chaque courbe à la suite de celles déjà écrites pour avoir toutes mes courbes cotes à cotes (lors du traitement excel ultérieur).

    Mais problème: comme mes courbes n'ont pas la même taille, il faut gérer les différences de taille pour ne pas transférer des données d'une courbe à l'autre au moment ou je vais "spliter" (sous excel) mes lignes avec le délimiter utilisé...
    expl:Si ma courbe 2 a plus de lignes que ma courbe 1, il faut que j'ajoute deux délimiter dès le début des lignes supérieurs aux lignes de la courbe1... sinon les valeurs seront interprété au moment du split comme appartenant à la courbe 1 (et j'ai tout qui se croise).

    Du coup c'est surtout sur l'écriture dans le CSV que je suis pas à l'aise pour boucler.
    Je n'arrive pas à construire un csv propre qui me générerais une vingtaine de colonne par un simple split sur excel.
    Dans mon fichier csv, c'est le traitement des futurs colonnes sans tout mélanger qui me bloque...

    je sais pas si j'ai été clair ... :-)
    mais merci de prendre du temps à réfléchir à mon souci !

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 : 4 064
    Par défaut
    Je vois pas la difficulté à faire quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for courbe in self.courbes:
        taille = len(courbe)
        traiter(courbe, taille)
    ou self.courbes et l'ensemble des courbes existantes

    Désolé je ne vois pas la complexité... Je pense que c'est un problème algorithmique où tu te sens perdu. Mais si tu détermines la taille d'une courbe, tu peux le faire pour plusieurs.

  7. #7
    Invité
    Invité(e)
    Par défaut
    En effet, c'est un pb d'algorithmique qui me pose des difficultés je pense...
    ton idée a l'air très bien mais je ne sais pas faire un truc probablement tout bête!
    comment je forme, à partir de différentes variables, un groupe pour pouvoir faire une boucle type:

    "for courbe in self.courbes:"

    comment déclarer courbe et self.courbes correctement?

    merci

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 : 4 064
    Par défaut
    comment déclarer courbe et self.courbes correctement?
    courbe est une variable créé automatiquement lors de la création de la boucle, ça veut dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pour la courbe parmi l'ensemble des courbes
        etc...
    self.boucles est une liste ou un tuple en python (voir des tutoriels python) représentant l'ensemble des courbes, exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.courbes = [courbe1, courbe2, courbe3, ...]

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    oui jusque là c'est bon, je suis!
    je crois que je me suis compliqué la vie pour rien.
    un truc comme ci dessous serait correct non?

    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
    i=0
    self.nb_courbes=10
    self.ad_save="adresse_sauvegarde"
    self.courbes=[courbe1,courbe2,courbe3,courbe4,courbe5,courbe6,courbe7,courbe8,courbe9,courbe10]
    fichier = open (self.ad_save,'w',newline='')
    ecriture=csv.writer(fichier,delimiter="$")
    for courbe in range(0,self.courbes,1):
         courbe=self.courbes[i]
         if len(courbe)>2:
              if csvcount(filename)>0:
                   #dans ce cas, le csv contient déjà des données et il faut concatener les suivantes (ou ajouter des lignes)
                   #le nombre de delimiter avant toute nouvelle datas/lignes est un multiple de 2 de l'index de courbe (+1)
                   #Bon et là je sais pas trop gérer mon append et/ou newline de mon csv déjà en parti rempli...
     
             elif csvcount(filename)==0: # c'est la première courbe non vide qui est exportée/enregistrée à partir d'un fichier csv vide. ici pas de souci, tout semble fonctionner
                   ecriture.writerow(("Temps","Tension"))
                   (self.x,self.y)=courbe.getData()
                   for y in range(0,len(self.x),1):
                        ecriture.writerow((self.x[y],self.y[y]))
         i=i+1
    try:
        fichier.close()
    except:
        buttonReply = QMessageBox.warning(self, 'Pilotage Appareil', "Une erreur est survenue lors de la fermeture du fichier de sauvegarde.")
    avec la fonction ci dessous qui est de toi je crois ;-) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def csvcount(filename):
        with open(filename, 'r') as f:
            i = 0
            for ligne in f:
                i += 1
        return i
    Dernière modification par Invité ; 07/03/2019 à 06h03.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Peut être que vous vous simplifiiez la vie en utilisant itertools.zip_longuest
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> a = 1,2,3
    >>> b = 5,6
    >>> c = 'wxyzab'
    >>> list(zip_longest(a, b, c, fillvalue='*'))
    [(1, 5, 'w'), (2, 6, 'x'), (3, '*', 'y'), ('*', '*', 'z'), ('*', '*', 'a'), ('*'
    , '*', 'b')]
    >>>
    ou a, b, c sont les courbes de taille différentes.

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

Discussions similaires

  1. [E-03] Sauvegarder Xls en Csv
    Par ash_rmy dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/03/2009, 12h49
  2. Transformer data (encolonne) en data csv sur une ligne
    Par chordially dans le forum VBA Access
    Réponses: 3
    Dernier message: 21/02/2009, 05h42
  3. Plus moyen de sauvegarder mes data dans tables
    Par melles dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/10/2008, 16h39
  4. Sauvegarde des data d'une table
    Par yanis97 dans le forum Oracle
    Réponses: 4
    Dernier message: 03/07/2007, 08h21
  5. Réponses: 2
    Dernier message: 14/05/2004, 12h55

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