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 :

Librairy csv.DictReader - Mise en forme


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut Librairy csv.DictReader - Mise en forme
    bonjour,

    csv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    time;part
    00h00;605
    00h05;246
    00h10;87
    00h15;405
    00h20;179

    csv.DictReader est bien pour de la convertion vers du json
    Mais tous les champs sont passé en string par défaut

    py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        f= csv.DictReader(fic1,delimiter=';')
        for row in f:
             print '===>',row

    ===> {'part': '833', 'time': '23h55'}

    Je cherche un moyen pour obtenir :

    ===> {'part': 833, 'time': '23h55'}

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

    Il y a plusieurs solutions pour faire ça.

    La plus brutale est de tenter une conversion avec int(...) dans un try:...except:.

    Mais la meilleure, pour moi, est de faire reconnaître un entier avec un motif d'expression régulière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python 3
     
    import re
     
    motif_entier = re.compile(r"^[+-]?[0-9]+$")
     
    elem = "-456"
    if motif_entier.match(elem):
        elem = int(elem)
        print(elem, type(elem)) # elem est un entier
    else:
        print(elem, type(elem)) # elem n'est pas un entier
    A noter que si le fichier csv vient d'Excel sur un Windows français, il y a un problème avec les flottants: ceux-ci viennent avec une virgule décimale, et il faut, de la même façon que précédemment, les faire reconnaître comme flottant avec un motif d'expression régulière, et si oui, remplacer la virgule décimale par un point avant de faire la conversion avec float(). A défaut de faire ça, les flottants en question avec virgule décimale resteront des chaines de caractères et ne pourront pas être utilisés dans des calculs avec Python.

    En fait, ces conversions automatiques, que Excel fait aussi, ont un défaut si on n'y prend pas garde. Par exemple, dans un programme qui traite d'adresses internationales, les codes postaux français seront automatiquement traduits en entier, mais ce n'est pas toujours le cas dans les autres pays (Espagne, Hongrie, Royaume-Uni, Canada, ...), ce qui donnera une colonne incohérente composées d'entiers et de chaines de caractères.

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

    Citation Envoyé par bm Voir le message
    Mais tous les champs sont passé en string par défaut
    Si votre fichier d'entrée était mieux construit, il pourrait convertir les champs sans quote en float... Mais si vous voulez un type "int", il faut convertir soi même.

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

  4. #4
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    tyrtamos : le fichier ne vient pas de excel et un cvs->json tordu est certainement bien pire

    wiztricks : le passage par un int() est le mieux

    Le format vient après la tabulation csv
    Un csv.DictReader() "map" ou trace un dic vide

    Créez un objet qui fonctionne comme un lecteur régulier mais mappe l'information lue dans un dict dont les clés sont données par le paramètre fieldnames facultatif.
    Le paramètre fieldnames est une séquence dont les éléments sont associés aux champs des données d'entrée.
    Ces éléments deviennent les clés du dictionnaire résultant.
    Si le paramètre fieldnames est omis, les valeurs de la première ligne du fichier csv seront utilisées comme nom de champ.
    Si la ligne lue a plus de champs que la séquence fieldnames, les données restantes sont ajoutées comme une séquence keyed par la valeur de restkey.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Mise en forme CSV puis import
    Par jouclar dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/02/2011, 09h36
  2. [Toutes versions] Ouverture et mise en forme de données en provenance d'un fichier CSV
    Par chachon dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/02/2011, 01h32
  3. Mise en forme fichier CSV
    Par jouclar dans le forum Général Python
    Réponses: 5
    Dernier message: 01/02/2011, 21h15
  4. [VBA-E] Mise en forme CSV (option regional)
    Par BenoitM dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/05/2006, 15h43
  5. [Librairies] fichier cvs; problème de mise en forme
    Par illegalsene dans le forum CVS
    Réponses: 3
    Dernier message: 19/10/2005, 15h35

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