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 :

Erreur d'encodage Python: UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 46
    Points : 47
    Points
    47
    Par défaut Erreur d'encodage Python: UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3
    Bonjour,

    J'ai un bogue avec mon module Python sous Windows, j'ouvre un fichier text avec des accents, je mets le string dans une variable et j'ouvre le client email par défaut de mes utilisateurs avec le corps du message.

    Sur mon poste tout fonctionne bien mais pas sous le poste des mes clients (Windows) également, voici mon code:

    Je récupère mon fichier text:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # Get e-mail body file
            email_body = open('config/email_body.txt').read().encode('cp1252')
    Puis j'ouvre l'email du client avec le body text et les fichiers attachés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                # Open default e-mail client, prepare e-mail
                Popen(            
                    obj_config['mail_section']['email_client_exe'].encode('cp1252') + 
                    " -compose " \
                    "to='" + obj_config['mail_section']['email_to'] + "'," \
                    "cc='" + obj_config['mail_section']['email_cc'] + "'," \
                    "subject='" + obj_config['mail_section']['email_subject'] + "'," \
                    "attachment='" + ','.join(files_list) + "'," \
                    "body='" + email_body + "'", stdout=PIPE, stderr=PIPE
    Moi tout fonctionne bien mais les autres postes voici l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ERROR: Traceback (most recent call last):
      File "C:\make_thon_rouge_report\make_thon_rouge_report.py", line 151, in send_com_department_report
        email_body = open('config/email_body.txt').read().encode('cp1252')
      File "C:\Python25\lib\encodings\cp1252.py", line 12, in encode
        return codecs.charmap_encode(input,errors,encoding_table)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 40: ordinal not in range(128)
    Note: je redirige la console dans sys.stdout et j'ai aussi tous mes "print" dans un fichier de log en plus...

    Une idée sur le standard pour faire ce que je souhaite?
    Merci,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,
    Sous Python2, l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    email_body = open('config/email_body.txt').read()
    retourne dans email_body un "str" composé de "bytes".
    Je ne comprends pas pourquoi vous appliquez .encode('cp1252') à cette chose là:
    .decode serait plus adapté non?
    Exemple:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> s = 'aéçà'
    >>> s.encode('latin-1')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 1: ordinal
    not in range(128)
    >>> s.decode('latin-1')
    u'a\x82\x87\x85'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 46
    Points : 47
    Points
    47
    Par défaut
    Si je ne fais pas ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    email_body = open('config/email_body.txt').read().encode('cp1252')
    Cela ne fonctionne pas, quand le client mail ouvre voici le body text que j'ai:
    ...en pièce jointe les extractions prévues pa...


    Si je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    email_body = open('config/email_body.txt').read().decode('latin-1')
    Alors: UnicodeDecodeError: 'utf8' codec can't decode bytes in position 31-33: invalid data...

    Avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print type(email_body) : <type 'unicode'>
    Avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    email_body = open('config/email_body.txt').read().encode('cp1252')
    J'ai un "str"

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 46
    Points : 47
    Points
    47
    Par défaut
    Peut-être que je dois ouvrir mon fichier qui contient des accents avec codec.open ...? Du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f = codecs.open(filename, 'r', encoding='latin-1')
    Pourtant j'avais déjà testé....Cela ne fonctionnait pas plus

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

    codecs.open(filename, 'r', encoding='latin-1').read() est logiquement équivalent à open(filename, 'r').read().decode('latin-1')
    Les 2 supposent que les bytes du fichier sont codés "latin-1" et doivent produire un buffer Unicode.

    Si le codage est différent, çà affichera de drôles de choses.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 46
    Points : 47
    Points
    47
    Par défaut
    Bon en fait je viens de trouver une solution, manifestement sous Python 2.5 si je mets dans Lib/sitecustomize.py

    avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sys
    sys.setdefaultencoding('utf8')
    Quand Python s'initialise il le fait avec sys. utf8 par défaut maintenant, si je ne mets pas ceci, il s'initialise avec ascii et je n'ai plus accès aux méthodes decode/encode par la suite!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Salut,

    Effectivement sous python 2.7, de base c'est l'ascii qui règne. Tu peux modifier ça grâce aux paramètre que tu as mis ou mettre en début de fichier :

    # -*- coding:utf-8 -*-


    Avec python3, c'est utf8 directement.

    Je te laisse un article expliquant très bien ces quelques détails : http://sametmax.com/lencoding-en-pyt...is-pour-toute/

    J'espère ne pas être arrivé trop tard ...

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

    Citation Envoyé par champomy62 Voir le message
    Effectivement sous python 2.7, de base c'est l'ascii qui règne.
    Ce qu'on a "de base" est un "par défaut". Le PO a choisi de le modifier via un sys.setdefaultencoding('utf8').
    Ca fonctionne. Il me semble plus judicieux d'apprendre à se dépatouiller avec les options .encode et .decode.
    C'est pas si compliqué et çà pourra toujours servir car à les données extérieures à un programme Python ne seront pas toujours encodées avec le "par défaut" choisi à l'instant t.


    Tu peux modifier ça grâce aux paramètre que tu as mis ou mettre en début de fichier :

    # -*- coding:utf-8 -*-


    Avec python3, c'est utf8 directement.

    Je te laisse un article expliquant très bien ces quelques détails : http://sametmax.com/lencoding-en-pyt...is-pour-toute/
    Pas mal le tuto.
    Relisez le! La règle numéro 3 ne s'applique qu'à l'encoding des scripts lorsqu'on y a écrit des commentaires ou des littéraux de type "string" avec des caractères accentués.

    Le problème posé par le PO est différent: il lit un fichier externe.
    De plus, regardez ses scripts: ses commentaires sont en english, de l'US ASCII:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Get e-mail body file
            email_body = open('config/email_body.txt').read().encode('cp1252')
    ...
                # Open default e-mail client, prepare e-mail
                Popen(
    A mon sens, c'est la moins mauvaise pratique.
    Mais je n'irai pas perdre mon temps à essayer de la défendre dans un forum pour les français: je vois déjà la levée de boucliers!

    De fait, l'ASCII est le sous ensemble commun de toutes les polices UTF-8, latin-1,.... une sorte d'espéranto passe partout, rien à déclarer...

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

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 26/01/2013, 16h25
  2. Erreur d'encodage avec python?
    Par nini_python dans le forum Tkinter
    Réponses: 3
    Dernier message: 26/07/2012, 00h25
  3. UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9'
    Par slaima15 dans le forum Général Python
    Réponses: 4
    Dernier message: 06/06/2011, 23h18
  4. UnicodeEncodeError: 'ascii' codec can't encode character
    Par WebTotoche dans le forum Général Python
    Réponses: 5
    Dernier message: 06/04/2011, 08h58
  5. 'ascii' codec can't decode byte
    Par Bibicmoi dans le forum Général Python
    Réponses: 5
    Dernier message: 28/08/2007, 23h15

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