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 :

mettre à jour un csv en plusieurs fois


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut mettre à jour un csv en plusieurs fois
    Bonjour,

    j'ai créer une fonction afin de mettre à jour un csv.(2 colonnes)

    Cette fonction intervient à la fin d'un traitement que je peux faire sur plusieurs fichiers.
    Celle ci fonctionne bien sauf que
    mon problème est que à chaque traitement ces 2 colonnes sont remplacés au lieu de se mettre à la suite???

    ce que je veux:
    traitement 1
    1---1
    traitement 2
    1---1---2---2
    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
    *
    def surface_reg(table,Nom,Surface):
        outputcsv = dossier+"//zniarea.csv"
        file = open (outputcsv, "wb")
        fields =[Nom,Surface]
        resultat=table
        writer = csv.writer(file,delimiter = ";")
        writer.writerow (fields)
     
     
        with arcpy.da.SearchCursor (resultat,fields) as cursor:
            for row in cursor:
     
                name=row[0]
                surf=row[1]
                writer = csv.writer(file,delimiter = ";")
                writer.writerow ((name,surf))
            file.close()
    je ne vois pas comment faire?

    merci de votre aide

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    Tu peux te dépatouiller comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def surface_reg(table, Nom, Surface):
        import numpy as np
        csv = "zniarea.csv"
        header = "Met ici quelque chose"
        data = np.array(table)
        with open(csv, 'w') as f:
            f.write(bytes(header+'\n'))
            np.savetxt(f,data,delimiter=';')
     
     
    if __name__ == "__main__":
     
        table = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
        surface_reg(table,'','')
    Bon j'utilise tout le temps numpy donc je te propose une solution y faisant appel, mais si tu ne souhaite pas l'utiliser il y a d'autres solutions.

    Le résultat produit ressemble à cela (dans l'état):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Met ici quelque chose
    1.000000000000000000e+00;2.000000000000000000e+00;3.000000000000000000e+00;4.000000000000000000e+00
    5.000000000000000000e+00;6.000000000000000000e+00;7.000000000000000000e+00;8.000000000000000000e+00
    9.000000000000000000e+00;1.000000000000000000e+01;1.100000000000000000e+01;1.200000000000000000e+01
    Je suppose que cette precision n'est pas utile. Tu peux paramétrer cela comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    np.savetxt(f,data,delimiter=';',fmt='%i')
    Ju

  3. #3
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Semaine charge... Ma réponse est à côté de la plaque il me semble.

    mon problème est que à chaque traitement ces 2 colonnes sont remplacés au lieu de se mettre à la suite???
    Le problem c'est que tu fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file = open (outputcsv, "wb")
    A chaque fois que tu fait appel à "open" sur "outputcsv", tu l'écrase.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Par défaut
    salut,

    j'ai résolu mon problème en créant une table dans un géodatabase (extension .mdb avec l'option spatiale, format sur le logiciel arcgis) et en faisant des insert.

    je ne connais pas du tout numpy mais je vais essayer..

    je ne trouve pas de ressources sur cette "open" . j'ai essayé de ne pas fermer le csv mais j'ai une erreur, j 'ai l impression qu il faut que j enregistre tt les valeurs dans des listes et que je crée mon csv en une seule fois?? je ne vois pas de solution...

    merci

  5. #5
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    j 'ai l impression qu il faut que j enregistre tt les valeurs dans des listes et que je crée mon csv en une seule fois?? je ne vois pas de solution...
    Tout à fait, si tu manipule un fichier texte tu as a ma connaissance les possibilities suivantes:
    • Lire (option 'w')
    • Ecrire en écrasant (option 'w' ou 'wb')
    • Ecrire à la suite (append, option 'a')

    Techniquement il est possible de rajouter des colonnes dans ton fichier csv, mais pour cela il te faudrait le réécrire totalement. Tout depend de la taille de ton fichier, mais cette option peut vite être trèès lourde.

    Pour ce qui est de l'idée de la base de donnée, désolé mais je laisse à d'autres le soin de juger, je n'y connais strictement rien.

    Ju

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Le seul moyen efficace de rajouter des cellules est de lire le fichier ligne par ligne, de concatener tes nouvelles cellules à la ligne et de sauver dans un nouveau fichier. Libre a toi d'effacer l'ancien fichier et de renommer le nouveau avec le nom de l'ancien. A noter que les flottants en python sont notés avec un point alors que dans Excell il faut une virgule.

    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
    import os
     
    text1 = """1.0;1.1;1.2;1.3
    2.0;2.1;2.2;2.3
    3.0;3.1;3.2;3"""
     
    FNAME1 = "dummy.csv"
    FNAME2 = "tempfile.csv"
    ARCHIVE = "dummy.csv.old"
     
    # csv file creation
    with open(FNAME1, "w") as fp:
        fp.write(text1)
     
    # new file creation from the ols one and new cells
    with open(FNAME1, "r") as fp1:
        with open(FNAME2, "w") as fp2:
            for index, line in enumerate(fp1.readlines()):
                line = line.strip()
                line += ";%s\n"%(float(index + 1) * 10.0)
                fp2.write(line)
     
    # trick to have the new cells in the old file
    if os.path.isfile(ARCHIVE):
        os.remove(ARCHIVE)
    os.rename(FNAME1, ARCHIVE)
    os.rename(FNAME2, FNAME1)
    A+

    Pfeuh

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/12/2009, 18h17
  2. mettre à jour plusieurs tables avec un formulaire
    Par kangourou_agile dans le forum Access
    Réponses: 6
    Dernier message: 07/08/2006, 15h33
  3. Réponses: 7
    Dernier message: 12/07/2006, 17h34
  4. Procédure mettre à jour plusieurs lignes
    Par JEFF56 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/05/2006, 10h53
  5. Réponses: 3
    Dernier message: 09/07/2004, 10h23

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