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 :

Remplir un fichier csv par le haut , tout en conservant les autres lignes


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Remplir un fichier csv par le haut , tout en conservant les autres lignes
    Bonjour,

    Je cherche actuellement à remplir un ficher CSV avec les données d'un compteur.
    Mais n'étant pas un expert en python3, je bloque un peu car j'aimerai avoir dans mon fichier csv le dernier relevé sur la première ligne.
    Alors voici ou je suis rendu.
    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
    52
    53
    54
    55
    56
    57
    58
    59
     
    #!/usr/bin/python3.4.2
    # -*- coding: utf-8 -*-
    import sys
    import os
    import time
    import datetime
    import subprocess
    import csv
     
    with open("compteur_data.csv","w") as csvfile:
                date = datetime.datetime.today()
                wtr=csv.writer(csvfile, delimiter=',')
     
                def csvcount(): #elle compte le nombre de ligne
                    with open("compteur_data.csv", 'r') as f:
                        i = 0
                        for ligne in f:
                            i += 1
                    return i
     
     
     
                def lines(j):# elle réecrit les lignes à la ligne du dessous enfin elle devrais je plante toujours dans cette boucle
     
     
                    if  j == 0 :
                        x=1
                    elif j != 0:
                        with open("compteur_data.csv", 'r') as f:
                            for ligne in f:
                            i=j
                                with open("compteur_data.csv", 'r') as f1:
                                    line=list(f1)[i]
                                    f1.close
     
                                    with open("compteur_data.csv", 'w') as f2:
                                        i=+1
                                        f2.write(line)
                                        f2.close
     
     
                            x=1
                            f.close
                    return x
                    chaine8="mes données"
     
                    print (chaine8[:-3])
                    sys.stdout.flush()
     
                    i = csvcount()
                    x = lines(i)
     
                    if x==1:
                        wtr.writerow([now,chaine8[:-3])
     
                    csvfile.flush()
     
                    time.sleep(5)
    En gros je plante ( erreur: mon programme plante à la deuxième acquisition et me retourne :list index out of range, problème de taille ? je vais taper dans un espace pas encore alloué..?) dans la deuxième fonction dans laquelle j'essaye recopier mes lignes, à la ligne suivante du fichier, bref je suis pas trop sure, de la manière dont attaqué le problème. Y a t'il peut être un mode d'écriture, qui realise mon souhait enfait j'aimerai savoir s'il y a un moyen de se repérer dans mon fichier csv, pour me permettre d'écrire à la première ligne..( j'ai fouiller un peu la doc peut être line_num peut aidé ?).
    Car même en décalant mes lignes d'une lignes comme je cherche à le faire je ne suis pas sure que la fonction writerow viendra écrire dans la 1er ligne qui sera maintenant vide ou bien qu'il continura à écrire sur la ligne vide la plus basse du fichier.
    Merci de votre attention
    PS: j'arrive à implémenter mes tabulation donc j'ai mit en lien mon code
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quand on lit un fichier csv, on se retrouve en mémoire avec une liste de lignes, chaque ligne étant une liste de données (chaines, nombres).

    Donc, en principe:
    - on lit le fichier csv => [[ligne0], [ligne1], ...] avec pour chaque ligne: [donnée1, donnée2, ...]
    - on construit la nouvelle ligne => [donnée1, donnée2, ...]
    - on ajoute au début la nouvelle ligne (maintenant sous forme de liste de données), comme ça (bien mettre les crochets!): [[nouvelleligne]] + [[ligne0], [ligne1], ...] ce qui donnera: [[nouvelleligne], [ligne0], [ligne1], ...]
    - on écrit le fichier csv avec la nouvelle liste de lignes.

    Si le fichier est très gros, cela peut poser des problèmes de temps de réponse. Dans ce cas, il est possible d'aller plus vite, mais la programmation sera plus délicate. Comme les fichiers csv sont avant tout des fichiers texte, le plus rapide serait probablement de faire une lecture binaire du fichier existant, d'ajouter la 1ère ligne en binaire, et de tout renvoyer en binaire. Si c'est trop gros pour la mémoire, il faudra créer un nouveau fichier par bloc et le renommer à la fin. La complexité dépendra surtout de la complexité de la nouvelle ligne csv à construire (présence de séparateurs dans les chaines, pb d'encodage, fin de ligne spécifique à un OS, etc...).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/03/2014, 14h40
  2. fichier csv par macro
    Par jnmab dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/12/2007, 23h31
  3. Lecture fichier .csv par colonne
    Par BRAUKRIS dans le forum Langage
    Réponses: 3
    Dernier message: 05/10/2007, 14h08
  4. [Macro] ouverture d'un fichier csv par macro différent du double-clic
    Par Caro-Line dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/04/2007, 16h36

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