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

Vue hybride

davtypo3 Erreur d'encodage Python:... 10/04/2014, 12h19
wiztricks Salut, Sous Python2,... 10/04/2014, 12h43
davtypo3 Si je ne fais pas ceci: ... 10/04/2014, 13h30
davtypo3 Peut-être que je dois ouvrir... 10/04/2014, 13h33
wiztricks Salut ... 10/04/2014, 14h36
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 46
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 718
    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 718
    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 averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 46
    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 averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 46
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 718
    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 718
    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 averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 46
    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!

+ 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