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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 : 3902
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
    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,

    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 averti
    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
    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 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,

    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

  5. #5
    Membre averti
    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
    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 : 3830
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 : 3777
Taille : 40,3 Ko

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

    Merci pour ton avis

  6. #6
    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
    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.

  7. #7
    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
    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 averti
    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
    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

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