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 :

Encodage de données dans un fichier Excel à partir d'un fichier plat


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Encodage de données dans un fichier Excel à partir d'un fichier plat
    Bonjour à tous,

    Je sollicite la communauté car je suis débutant en Python et je rencontre un pb concernant l'encodage de caractères lorsque j'écris dans un fichier Excel à partir de données contenues dans une fichier plat.

    Tout d'abord voici le contexte technique :
    Python v3.4.2
    Librairie xlsxwriter v0.6.6
    Fichier à lire : encodage en ANSI (Informations dispensées par Notepad ++ => ANSI as UTF8, le pb est constaté également avec des fichiers d'entrée purement UTF-8)

    Extrait du fichier plat :
    1079261~Annulé : Bouclage HTA sur départ Vallée de l' Ouche de CRUGEY~HTA~Etude~0~Côte d'Or~RAB-HTA-2013-002025~Investissement (CAPEX)~~1880365282~898831200~3520224663~~~~~08/10/2013~~~~TMP01101480~~Ce départ comporte une longue antenne de 9 postes sur la Commune de La Bussière sur Ouche NB : La FP 2013-000893 suggère un IACM entre l' IPT 145 et l' IAT 107 ( 11 dérivations - 19 postes )~
    1079300~Annulé : OMT sur départ Laquais de CHATILLON~HTA~Etude~0~Côte d'Or~RAB-HTA-2013-002038~Investissement (CAPEX)~~1880365282
    Je lis mon fichier plat de la manière suivante :

    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
     
    f = open(path_TMP+"/" +file,'rt')
    lignes  = f.readlines()
    f.close()
     
    index_ligne = 1
    for ligne in lignes:
    	fields = ligne.split("~")
    	worksheet.write_row(0, 0, entetes[nom_feuille])
    	k=0
    	while k < len(fields):
    		champ = fields[k].encode('utf-8')
    		worksheet.write_row(index_ligne, k, str(champ))
    		k=k+1
     
     
    	#worksheet.write_row(index_ligne, 0, fields)
    	index_ligne = index_ligne + 1
    J'obtiens un résultat équivalent à ça :
    045985456 Annulé : Bouclage HTA sur départ Vallée de l' Ouche de CRUGEY HTA Etude ...
    56457 Sécurisation zone de peche Ã* PERRIGNY SUR L'OGNON HTA Côte d'Or ...
    1234 Structure sur départ Chambeire de GENLIS DST établie ... ...

    Après de multiples recherche sur internet et des bcp de test de bout de code je n'arrive pas à visualiser correctement mes accents dans Excel (exemple : é, è, à, ê, etc).

    Pourriez vous m'expliquer d'ou vient mon pb et comment le résoudre s'il vous plait ?
    D'avance merci

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

    Vous travaillez sous Python3, essayez avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	while k < len(fields):
    		worksheet.write_row(index_ligne, k, fields[k])
    		k=k+1
    çà devrait marcher tout seul, non?

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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    @wiztricks
    çà devrait marcher tout seul, non?
    Malheureusement non, ça ne marche pas !

    J'ai de nouveau essayer de cette maniè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
    15
    16
    17
    18
     
    f = open(path_TMP+"/" +file,'r')
    lignes  = f.readlines()
    f.close()
     
    index_ligne = 1
    for ligne in lignes:
    	#fields = ligne.split("~")
    	#worksheet.write_row(index_ligne, 0, fields)
     
    	# #########
    	fields = ligne.split("~")
    	k=0
    	while k < len(fields):
    		worksheet.write(index_ligne, k, str(fields[k]))
    		k=k+1
    	# #########
    	index_ligne = index_ligne + 1
    J'obtiens toujours le même pb, c'est à dire que dans mon fichier Excel j'ai les caractères suivant : é, ô, Ã* ou bien encore ô.
    J'ai vérifié l'encodage de mon fichier via Notepad++ et ce dernie indique : ANSI as UTF-8

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

    Comme Excel est un produit Windows, il faudrait essayer d'encoder plutôt en "cp1252" (que Microsoft appelle "ANSI").
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Je viens de faire ce test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import  xlsxwriter as xl
    >>> wb = xl.Workbook('test.xlsx')
    >>> sheet = wb.add_worksheet()
    >>> sheet.write('A1', 'aéù')
    0
    >>> wb.close()
    >>>
    Et le document ouvert par Excel ou OpenOffice affiche correctement les caractères accentués.

    Si ce simple test fonctionne aussi chez vous, il faudrait s'inquiéter de comment se passe la lecture.
    note: je ne vois pas comment vous ouvrez cela avec notepad: c'est un ZIP de fichiers XML.

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

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    @wiztricks
    note: je ne vois pas comment vous ouvrez cela avec notepad: c'est un ZIP de fichiers XML.
    Je me suis mal exprimé...
    Lorsque je regarde mon fichier plat (la source des données) sous Notepad++, je m'aperçois que l'encodage est "ANSI as UTF_8".
    De plus je suis d'accord avec toi, le bout de code tu as fourni est en effet fonctionnel. Je positionne mes entêtes de cette manière et ça marche très bien sans pb d'accent.

    Du coup je rejoins tyrtamos sur son analyse : ce qui pose problème c'est en effet l'encodage de mon fichier source.
    Car j'ai transformé mon source dans Notepad ++ en ANSI et là ça marche impeccable => A moins avis il faut que j'arrive à convertir mes champs (mes données de manières générales) en ANSI avant de les écrire dans le fichier Excel.

    Du coup je formule une nouvelle question :
    Comment convertir une chaine de caractère en ANSI (ou cp1252 selon tyrtamos) avant de l'écrire dans un fichier Excel ?

    Pour information voici exactement ce que je veux faire :
    A partir d'une archive TAR.GZ qui contient plusieurs fichiers plats produit sous linux, je souhaite lire chacun de ces fichiers plats et les remonter dans un fichier XLS qui contiendrai un onglet par fichiers lus.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par edouard.danaradjou Voir le message
    Comment convertir une chaine de caractère en ANSI (ou cp1252 selon tyrtamos) avant de l'écrire dans un fichier Excel ?

    Pour information voici exactement ce que je veux faire :
    A partir d'une archive TAR.GZ qui contient plusieurs fichiers plats produit sous linux, je souhaite lire chacun de ces fichiers plats et les remonter dans un fichier XLS qui contiendrai un onglet par fichiers lus.
    Vous travaillez sous Python3. Le fichier étant lu comme fichier texte, vous récupérez directement de l'UNICODE et si le decode fonctionne c'est que son encoding est "utf-8". Et comme mon exemple fonctionne aussi chez vous, c'est que xlsxwriter sait convertir de l'unicode en utf-8.

    Essayez d'uploader un de ces fichiers (ou partie) pour qu'on puisse regarder la chose "binaire".

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

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    j'ai fait un essai avec un fichier texte encodé en UTF-8 (sans BOM) et le même encodé en ANSI.

    pour avoir les accents corrects dans le fichier de sortie quand le fichier texte est encodé en UTF-8 j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f = open('data.txt', encoding='utf-8', mode='r')
    j'ai utilisé la librairie openpyxl au lieu de xlsxwriter. Voici le code complet :
    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
    from openpyxl import Workbook
     
    wb = Workbook()
    ws = wb.active
    ws.title = "importation"
    dest_filename = 'fichier_dst.xlsx'
    f = open('data.txt', encoding='utf-8', mode='r')
    lignes  = f.readlines()
    f.close()
     
    index_ligne = 1
    for ligne in lignes:
        fields = ligne.split("~")
        k=0
        while k < len(fields):
            ws.cell(row = index_ligne,column = k+1).value =  str(fields[k])
            k=k+1
    	# #########
        index_ligne = index_ligne + 1
     
     
    wb.save(filename = dest_filename)
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    @jurassic pork :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f = open('data.txt', encoding='utf-8', mode='r')
    J'ai testé cette solution et cela fonctionne parfaitement !!
    Merci beaucoup.

    En conséquence je passe ce sujet en résolu. Merci encore à tous les contributeurs

  10. #10
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    pour la question : pourquoi faut-il mettre encoding='utf-8' ? voici ce que j'ai trouvé :

    Lorsque vous ouvrez un fichier en lecture, par défaut, Python considère que le fichier est encodé suivant la norme par défaut de votre système d'exploitation, mais ce n'est évidemment pas une certitude.
    pour plus de précision voir ici

    ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

Discussions similaires

  1. [XL-2013] Remplir un fichier excel à partir d'autres fichiers excel
    Par L.Sébastien dans le forum Excel
    Réponses: 4
    Dernier message: 06/05/2014, 09h28
  2. Réponses: 2
    Dernier message: 20/03/2014, 10h09
  3. Réponses: 1
    Dernier message: 25/03/2013, 08h39
  4. [MySQL] Problème d'insertion de données dans une base MySql à partir d'un fichier csv
    Par kazabandi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/12/2010, 18h05
  5. [E-03] Créer un fichier Excel à partir de 3 fichiers Excel et de filtres
    Par mariekero dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/11/2008, 16h15

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