écriture d'un fichier csv avec un dictionnaire

LALO_5656 Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33780 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour à tous,

Je voudrais écrire un fichier CSV avec un dictionnaire que j'ai créé et dont les valeurs sont contenues dans des variables.

Je récupère les valeurs en utilisant le module regex.

Le problème, c'est que le code me génère les données de la dernière ligne en la dupliquant.

Un extrait de mon code.

import os
import re
import csv

rep = "C:/Users/YELLE/Documents/Coordonnées/traitements 6.6/I16T08"
for nom in os.listdir(rep):
    f = os.path.join(rep, nom, )
    # print(f)
    if os.path.isfile(f) and f.endswith(".LAS"):
        with open(f, "r") as lasfile:
            texte = lasfile.readlines()
            # print(texte)
            nom_tir = (re.findall(r'[A-Z]\d{1,2}[A-Z]\d{1,2}', texte[14]))                               
            prof = (re.findall(r'\d{1,2}\.\d{1,2}', texte[9]))           # prof
            nom_sonde = ((re.findall(r'GGWL_\d{2,4}', texte[15])))      #sonde
            chantier = (re.findall(r"\s[a-zA-Z]+.[a-zA-Z]+", texte[20]))
            diametre = (re.findall(r'\d{2,3}\.\d{1,2}', texte[27]))          #diam
            date = (re.findall(r'\d{2}/\d{2}/\d{2}', texte[37]))            # date
            operateur = (re.findall(r"\s[a-zA-Z]+.[a-zA-Z]+.[a-zA-Z]", texte[42]))
            # ope = (re.sub(r"\s\s+", " ", texte[42]))                  # operateur
            # matches = re.search(r"\.(.*)\:", ope)
            # operateur = matches.group(1)

            # print(re.findall(r'\d{2,4}', texte[44]))                #baie
            # print(re.findall(r'\d{2}:\d{2}', texte[41]))            #heure
            # donnees = (texte[58:])
            # # print(donnees)
            # for ligne in donnees:
            #     tst = (ligne.split())
            #     # print(tst)
            #     pas = float(tst[0])
            #     gros = float(tst[1])
            #     vitesse = float(tst[2])
                # print(pas)
                # print(gros)
                # print(vitesse)

            # resultats = (chantier, nom_tir, diametre, nom_sonde)
            # print(resultats)
            # print(type(resultats))
            header = ["gis", "tir", "diam", "sonde","profondeur"]
            dictionnaire = {"gis": chantier, "tir": nom_tir, "diam": diametre, "sonde": nom_sonde, "profondeur": prof}
            print(dictionnaire)
            monfichier = "C:/Users/YELLE/Desktop/monfichier.csv"
            with open(monfichier, "w", newline="\n") as csvfile:
                writer = csv.DictWriter(csvfile, fieldnames=header)
                writer.writeheader()
                for element in dictionnaire:
                    writer.writerow(dictionnaire)
            with open("monfichier.csv", "r") as f:
                reader = csv.DictReader(f)
                for ligne in reader:
                    print(ligne)

D'avance merci pour toute aide

A voir également:

5 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

Ta première erreur, je pense, est d'utiliser l'option "w" en ligne 45.  Cela crée donc à chaque fois un nouveau fichier.  

Je pense que cela explique que tu ne voies que les données de la dernière ligne.

0
LALO_5656 Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   2
 

Ok, mais sinon monfichier n'existe pas , je voulais le Crée

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

Bonne idée, connais-tu une autre option que "w", qui permette de faire cela sans vider le fichier à chaque fois?

0
blux Messages postés 27153 Date d'inscription   Statut Modérateur Dernière intervention   3 362
 

Salut,

'a', comme append ?


0
LALO_5656 Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   2
 

Bien sûr, je vais essayer

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LALO_5656 Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   2
 

Bonjour, effectivement je récupères les données. Néanmoins dans le fichier sur chaque ligne il me récupère le header et 5fois la même information et ainsi de suite.

une idée de ce qui peut être à l'origine

Merci

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

L'origine m'en semble limpide.  Examine bien tes lignes 48 et 49.

En réalité, l'ensemble de ton code est mal conçu.  On dirait que tu as commencé avec l'idée d'accumuler toutes les données et puis de tout écrire dans le fichier csv.  Puis que tu as oublié cette idée et que tu écris au fur et à mesure.

Du coup, tout est bancal.

0
mamiemando Messages postés 33780 Date d'inscription   Statut Modérateur Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

Je rejoins yg_be, de manière générale, on ne s'amuse pas à ouvrir plusieurs fois un même fichier, on le fait une fois pour toute, et tant qu'on en a besoin. Dans ton cas, tu devrais avoir deux descripteurs de fichiers ouverts : un en lecture, et un en écriture. On peut écrire dans un fichier ouvert en écriture avec :

with open("bonjour.txt", "w") as f:
    for i in range(10):
        print(i, file=f)

Par ailleurs, vu que le donnée que tu veux sauver est un dictionnaire, il serait peut être plus avisé de la sauver dans un fichier json (au lieu de csv) :

import json

d = {"a": 1, "b": 2}

# Sauvegarde dans toto.json
with open("toto.json", "w") as f:
    json.dump(d, fp=f)

# Chargement depuis toto.json
d2 = None
with open("toto.json", "r") as f:
    d2 = json.load(fp=f)
print(d2)

Bonne chance

0