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 :

changement de séparateur décimal dans fichier csv


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 55
    Points : 24
    Points
    24
    Par défaut changement de séparateur décimal dans fichier csv
    Bonjour,
    Je suis débutant en python et confronté au problème suivant:
    changer le séparateur décimal (point en virgule) dans un fichier tableau .csv (dans le but de le convertir ensuite en fichier excel).

    J'ai créé pour cela un ''script python école'':

    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
    import csv
    import openpyxl
     
    wb = openpyxl.Workbook()
    ws = wb.active
     
    valeurs = [
         ['1.1', '2.1'],
         ['2.1', '2.2'],
         ['3.1', '3.2']
    ]
     
    f = open('monFichier.csv', 'w')
     
    for valeur in valeurs:
         ligne = ";".join(valeur) + "\n"
         f.write(ligne)
     
    f.close()
    En toute logique, l'exécution de ce script conduit au fichier .csv suivant:

    Nom : image_25dec2016.jpg
Affichages : 3448
Taille : 8,9 Ko

    Mon problème est de compléter le script python au dessus pour changer le séparateur décimal (point en virgule) afin de générer un fichier excel à la place d'un fichier .csv (sans intervenir directement sur les valeurs d'entrée du script) .

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> '2.1'.replace('.', ',')
    '2,1'
    >>>
    mais c'est une façon plutôt naïve pour traiter représentation des nombres flottants et locale tant dans les fichiers CSV que dans EXCEL.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Merci wiztricks ,
    Je me suis inspiré de ta remarque et je suis arrivé au script suivant:

    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 csv
    import openpyxl
     
    wb = openpyxl.Workbook()
    ws = wb.active
     
    valeurs = [
         ['1.1', '2.1'],
         ['2.1', '2.2'],
         ['3.1', '3.2']
    ]
     
    f = open('monFichier.csv','w')
     
    for valeur in valeurs:
         ligne = ";".join(valeur) + "\n"
         ligne=ligne.replace('.',',')
         print ligne
         f.write(ligne)
     
    f = open('monFichier.csv')
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        ws.append(row)
    f.close()
     
    wb.save('monfichier2.xlsx')
    Un peu lourd sans doute....

    Remplit son rôle (à savoir générer un fichier excel), sauf que excel ne reconnait pas les cellules au format 'nombre', mais au format texte !

    Merci pour ton aide et bonnes fêtes

  4. #4
    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,

    C'est un problème connu: dans les échanges de données csv avec EXCEL:

    - dans le sens Excel => Python, Excel sur un Windows français adopte la notation des réels avec une virgule décimale, ce que Python considère comme des chaines de caractères, et la conversion avec float(...) échoue.

    - dans le sens Python => Excel, si on veut qu'un réel venant de Python soit reconnu comme un réel dans Excel, il faut qu'il ait une virgule décimale.

    A noter que si la chaine de caractère représentant un nombre avec la virgule décimale arrive dans Excel, sa conversion en nombre est automatique, même si on ne le veut pas! Par exemple, dans des adresses postales internationales, les codes postaux purement numériques seront des nombres, mais pas les autres: il ne seront donc pas alignés, et les éventuels tris seront faux.


    La solution que j'ai adoptée consiste à utiliser des expressions régulières. Exemple:

    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
    import re
     
    motif_entier = re.compile(r"^[+-]?[0-9]+$")
    motif_reelp =  re.compile(r"^[+-]?(([0-9]+(\.[0-9]*)?)|\.[0-9]+)([eE][+-]?[0-9]+)?$")
    motif_reelv =  re.compile(r"^[+-]?(([0-9]+(,[0-9]*)?)|,[0-9]+)([eE][+-]?[0-9]+)?$")
     
    # quelques exemples:
    elems = ["1234",
             "+1234",
             "-1234",
             "0.123",
             "0.123e-5",
             "0,123",
             "23,456E-89",
             "+0.123",
             "-0.123",
             "123A",
             "*1.789"]
     
    for elem in elems:
     
        if motif_entier.match(elem):
            print(elem, "est un entier")
        elif motif_reelp.match(elem):
            print(elem, "est un réel avec un point décimal")
        elif motif_reelv.match(elem):
            print(elem, "est un réel avec une virgule décimale")
        else:
            print(elem, "n'est pas un nombre")
    Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    1234 est un entier
    +1234 est un entier
    -1234 est un entier
    0.123 est un réel avec un point décimal
    0.123e-5 est un réel avec un point décimal
    0,123 est un réel avec une virgule décimale
    23,456E-89 est un réel avec une virgule décimale
    +0.123 est un réel avec un point décimal
    -0.123 est un réel avec un point décimal
    123A n'est pas un nombre
    *1.789 n'est pas un nombre
    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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Merci tyrtamos pour cette explication intéressante.
    Néanmoins, je ne comprends toujours pas:
    Avec le script posté à 18h02, voici l'allure du fichier excel xslx (2010) généré:

    Nom : image_25dec2016.jpg
Affichages : 3383
Taille : 10,4 Ko

    avec comme commentaire (point d'exclamation jaune): ''Le nombre de cette cellule est au format texte ou précédé d'une apostrophe''.

    Et les nombres sont alignés à gauche !

    Et pourtant (je te cite):

    Nom : A noter.jpg
Affichages : 3327
Taille : 40,3 Ko

    Pourquoi la conversion en nombre n'est-elle pas automatique ?

    Merci pour ton avis

  6. #6
    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
    Je viens d'essayer avec le fichier csv suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1.2;"3.4";89
    1,2;"3,4";"89"
    Après ouverture dans Excel (version 2013), le résultat est conforme à ce que j'en savais:

    - les nb à point décimaux, avec ou sans guillemets, sont reconnus comme des chaines de caractères, et sont alignés à gauche.

    - Les autres nombres entiers et réels à virgules décimales, avec ou sans guillemets, sont reconnus comme nombres et alignés à droite.

    ???

    Donne ici le contenu de ton fichier csv.
    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

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Donne ici le contenu de ton fichier csv.
    Il est dans les réponses précédentes.
    Tu remarqueras aussi que le PO génère directement un fichier XL avec openpyxl.
    A part çà... bonnes fêtes.

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

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Le contenu de mon fichier python est dans mon post de 18h02.
    Ce script est autonome car il génère un fichier csv et un fichier xlsx.
    Tu peux donc le tester à partir de rien avec python 2.7.
    Je t'envoie quand même le .csv généré par le script:
    monFichier.zip

    Merci beaucoup

  9. #9
    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 wiztricks,

    Citation Envoyé par wiztricks Voir le message
    Tu remarqueras aussi que le PO génère directement un fichier XL avec openpyxl.
    Et non, je n'avais pas remarqué: j'avais seulement vu csv dans le code...

    Je comprends mieux le pb, mais je ne serai d'aucune aide: je n'utilise pas openpyxl.

    Citation Envoyé par wiztricks Voir le message
    A part çà... bonnes fêtes.
    Merci! De même!
    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

  10. #10
    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
    Citation Envoyé par TITIB2 Voir le message
    Je t'envoie quand même le .csv généré par le script
    Ton fichier csv ouvert dans Excel donne de parfait résultats! Tous tes nombres à virgule décimale sont reconnus par Excel comme des nombres et alignés à droite.
    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

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 55
    Points : 24
    Points
    24
    Par défaut
    Ce qui sous-entend que le fichier .csv créé par mon script est un fichier excel, sauf pour l'extension.
    Finalement, la dernière instruction de mon script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wb.save('monfichier2.xlsx')
    ne sert à rien et dénature les cellules du fichier excel !

    wiztricks et tyrtamos, merci pour votre support

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/05/2014, 11h39
  2. Problème de séparateur dans fichier CSV
    Par mbibim63 dans le forum Excel
    Réponses: 4
    Dernier message: 05/07/2007, 08h29
  3. Sauvegarde de données dans fichier csv
    Par issou dans le forum C
    Réponses: 1
    Dernier message: 22/12/2005, 08h36
  4. [CSV] Détecter le séparateur pour les fichiers CSV
    Par JavaEli dans le forum Langage
    Réponses: 1
    Dernier message: 30/11/2005, 23h42
  5. [Excel] séparateur pour les fichiers csv
    Par drinkmilk dans le forum Excel
    Réponses: 2
    Dernier message: 27/08/2005, 14h21

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