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 :

encoding utf-8 et lecture de string avec accent


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut encoding utf-8 et lecture de string avec accent
    Bonjour,

    mon code semble ne pas arriver à lire des str contenant des caractères spéciaux comme des accents. J'ai pourtant bien précisé l'encodage en début de code. Je suis en python 2.7, pas de possibilité de passer en v3 (qui à priori gère mieux les encodages).

    Voici une partie du code : (ispReference et batiment sont des variables définies précédemment).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    ....
     
    if str(ispReference) != str(batiment):
        error = "X"
     
    outfile.write(str(objectdId) + ";" + str(batiment) + ";" + str(n_pm) + ";" + str(n_ispContainer) + ";" + str(ispReference) + ";" + str(error) + "\n")
     
    outfile.close()
    Voici l'erreur rencontrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "D:\Python27\ArcGIS10.2\lib\lib-tk\Tkinter.py", line 1470, in __call__
    return self.func(*args)
    ....
    if str(ispReference) != str(batiment):
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 3:
    ordinal not in range(128)

    Merci pour votre aide
    Cordialement
    Images attachées Images attachées  

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

    L'erreur dit que la fonction str appliqué à la variable ispReference (ou batiment) plante parce qu'elle n'arrive pas à encoder l'Unicode en ASCII (UnicodeEncodeError).

    La vraie question est de savoir pourquoi vous encodez (via str) une chaine de caractère déjà Unicode?
    Encodage et décodages sont à faire lorsqu'on lit ou qu'on écrit (dans un fichier texte). Vous travaillez en Unicode dans votre programme (et donc vos variables "chaines de caractères" sont toujours Unicode).

    N'hésitez pas à consulter le how-to Python 2.7 donnant les astuces à connaître pour s'en sortir.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    Bonjour,

    Merci pour la réponse,

    Mais dans ce cas comment écrire sur mon fichier csv en sortie ? si je n'utilise pas str, j'ai une erreur me disant que je ne peux pas ajouter des int et des str avec la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outfile.write(objectdId + ";" + batiment + ";" + n_pm + ";" + n_ispContainer + ";" + ispReference + ";" + error + "\n")
    TypeError: unsupported operand type(s) for +: 'int' and 'str'

    Merci

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

    Citation Envoyé par Gustz Voir le message
    Mais dans ce cas comment écrire sur mon fichier csv en sortie ? si je n'utilise pas str, j'ai une erreur me disant que je ne peux pas ajouter des int et des str avec la commande
    Vous avez ici 3 sujets.

    Le premier est qu'un fichier est une suite d'octets. Donc tout ce qu'on en lit ou tout ce qu'on y écrit doit être suite d'octets.

    Le deuxième est que suite d'octets peut être chaîne de caractères mais passer de l'un à l'autre se fait par encode/decode (et Python 2 n'aide pas).

    Le 3ème est que pour fabriquer une chaine de caractères en en concaténant d'autres, on a (par exemple) l'opérateur "+". Mais a + b sera valide si a et b sont des chaines de caractères sinon il faut faire une conversion explicite.

    C'est la compréhension de ces différences qui explique quand utiliser "str" plutôt que de le saupoudrer au cas où: c'est une opération pas une poudre magique.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    Ok,

    et donc concrètement, qu'est ce qu'il faudrait faire pour arriver à concaténer ces variables ? (désolé j'ai beaucoup de mal avec ces questions d'encodage)
    sachant que la variable objectid, n_pm, n_ispcontainer sont des int alors que batiment, ispReference, error et ";" sont des str.

    J'ai donc tenter d'exécuter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outfile.write(str(objectdId) + ";" + batiment + ";" + str(n_pm) + ";" + str(n_ispContainer) + ";" + ispReference + ";" + error + "\n")
    mais j'ai toujours le problème d'encodage du début...

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

    Citation Envoyé par Gustz Voir le message
    mais j'ai toujours le problème d'encodage du début...
    Le problème d'encodage initial était à une ligne donnée qui exécutait une autre instruction.
    Autre ligne, autre problème...
    Sans le message d'erreur pour confirmer que c'est bien la ligne que vous suspectez et la même erreur...

    Et comme vous utilisez Python2 vous avez des soucis car vous pouvez concaténer des bytes avec des strings unicode.
    Parfois çà marche, parfois çà plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> 'aaa' + u'aaa'
    u'aaaaaa'
    >>> 'aaé' + u'aaa'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 2: ordinal
    not in range(128)
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    ici en testant ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    ....
     
    if ispReference != batiment:
        error = "X"
     
    outfile.write(str(objectdId) + ";" + batiment + ";" + str(n_pm) + ";" + str(n_ispContainer) + ";" + ispReference + ";" + error + "\n")
     
    outfile.close()
    j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "D:\Python27\ArcGIS10.2\lib\lib-tk\Tkinter.py", line 1470, in __call__
    return self.func(*args)
    ....
    outfile.write(str(objectdId) + ";" + batiment + ";" + str(n_pm) + ";" + str(n_ispContainer) + ";" + ispReference + ";" + error + "\n")
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 10:
    ordinal not in range(128)
    le problème sur le if est résolu mais la concaténation plante

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

    Citation Envoyé par Gustz Voir le message
    le problème sur le if est résolu mais la concaténation plante
    La concaténation forcera des "encode" mais l'écriture dans le fichier aussi.
    Séparez les deux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s = ... concaténation...
    f.write(s)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    ça fonctionne !

    Merci beaucoup !

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Gustz Voir le message
    ça fonctionne !
    Pour limiter au maximum les soucis, il faut essayer de toujours travailler en unicode en rajoutant le from __future__ import unicode. Déjà ça prépare pour Python3 sur lequel tu devras fatalement basculer un jour ou l'autre.
    Ensuite, si une data entre dans ton programme, tu la convertis en unicode le plus tôt possible. Et si elle doit en sortir, alors tu la convertis dans l'encoding de sortie le plus tard possible.
    C'est astreignant, mais ça paye.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [DisplayTag] Problème d'encoding UTF-8 avec export
    Par Fr@ncky dans le forum Taglibs
    Réponses: 19
    Dernier message: 04/06/2015, 08h48
  2. [PHP 4] lecture de fichiers avec accents
    Par mialy.rakot dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2010, 13h50
  3. String avec accent dans cookie
    Par Plawi dans le forum ASP.NET
    Réponses: 4
    Dernier message: 29/07/2008, 11h22
  4. Copie de String Avec Accents ou Apostrophe
    Par progamer54 dans le forum Langage
    Réponses: 3
    Dernier message: 30/10/2007, 10h40
  5. Gridview fichier .resx et Strings avec accents
    Par Poussy-Puce dans le forum ASP.NET
    Réponses: 7
    Dernier message: 03/05/2007, 08h56

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