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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 738
    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 738
    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 738
    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 738
    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 738
    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 738
    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

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