écriture d'un fichier csv avec un dictionnaire

LALO_5656 Messages postés 29 Date d'inscription mardi 8 novembre 2022 Statut Membre Dernière intervention 21 septembre 2024 - Modifié le 17 juin 2024 à 12:22
mamiemando Messages postés 33294 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 septembre 2024 - 17 juin 2024 à 12:30

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 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 Ambassadeur 1 538
Modifié le 15 juin 2024 à 13:32

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 mardi 8 novembre 2022 Statut Membre Dernière intervention 21 septembre 2024 2
15 juin 2024 à 14:31

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

0
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 538
15 juin 2024 à 14:54

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 26312 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 30 septembre 2024 3 300
15 juin 2024 à 15:20

Salut,

'a', comme append ?


0
LALO_5656 Messages postés 29 Date d'inscription mardi 8 novembre 2022 Statut Membre Dernière intervention 21 septembre 2024 2
Modifié le 17 juin 2024 à 12:24

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 mardi 8 novembre 2022 Statut Membre Dernière intervention 21 septembre 2024 2
16 juin 2024 à 07:31

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 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 538
16 juin 2024 à 12:08

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 33294 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 septembre 2024 7 788 > yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024
Modifié le 17 juin 2024 à 12:30

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