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 :

Unicode Encode Error en ecriture fichier txt [Python 2.X]


Sujet :

Python

  1. #1
    Membre régulier Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Points : 82
    Points
    82
    Par défaut Unicode Encode Error en ecriture fichier txt
    Bonjour,

    Après une lecture du ping suivant la fonction ci dessous, la variable "reponse" lors de l'écriture dans fichier txt, j'ai l'erreur suivante :
    Auriez-vous la solution car en python 3.4 cela fonctionne et je suis retourner en version 2.7 à cause de souci de compilation.
    merci
    cordialement

    Erreur produite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unicode Encode Error: 'ascii' codec can't encode character u'\xae' in position 18: ordinal not in range(128)

    affichage en console correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Envoi d'une requête 'Ping'  192.168.0.13 avec 32 octets de données*:
    Réponse de 192.168.0.13*: octets=32 temps<1ms TTL=128
    Réponse de 192.168.0.13*: octets=32 temps<1ms TTL=128
    Réponse de 192.168.0.13*: octets=32 temps<1ms TTL=128
    Réponse de 192.168.0.13*: octets=32 temps<1ms TTL=128
     
    Statistiques Ping pour 192.168.0.13:
        Paquets*: envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
    Durée approximative des boucles en millisecondes :
        Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms
    Pour voir pourquoi, j'ai placé la variable dans un tableau pour voir ce quelle donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [u"\r\nEnvoi d'une requ\xeate 'Ping'  192.168.0.13 avec 32 octets de donn\xe9es\xa0:\r\nR\xe9ponse de 192.168.0.13\xa0: octets=32 temps<1ms TTL=128\r\nR\xe9ponse de 192.168.0.13\xa0: octets=32 temps<1ms TTL=128\r\nR\xe9ponse de 192.168.0.13\xa0: octets=32 temps<1ms TTL=128\r\nR\xe9ponse de 192.168.0.13\xa0: octets=32 temps<1ms TTL=128\r\n\r\nStatistiques Ping pour 192.168.0.13:\r\n    Paquets\xa0: envoy\xe9s = 4, re\xe7us = 4, perdus = 0 (perte 0%),\r\nDur\xe9e approximative des boucles en millisecondes :\r\n    Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms\r\n"]
    0
    Partie du code
    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
    23
    24
    25
    26
    27
    28
    29
     
    #! /usr/bin/python
    #_*_ coding:utf-8 _*_
    # Python 2.7.7
    # ------------------------------------------
    # Analyse de ping
    # ------------------------------------------
     
    def analyse_ping():
        import socket,subprocess,os,sys
        ip = socket.gethostbyname(socket.gethostname())
        encodage="cp850"            
        # envoie un ping à l'ordinateur d'adresse ip, et retourne la réponse sous forme d'une liste de lignes unicode """  
        commande = ["ping ", ip]
        try:
            os.system('echo Analyse en cours...')
            out, _ = subprocess.Popen(commande, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False).communicate()
        except (ValueError, OSError) as err:
            return ("Erreur: %s" % (err.args[0],)).decode(encodage)
     
        reponse = out.decode(encodage)
     
        # importe le résultat dans fichier txt
        with open('ping.txt', 'w') as fichier:
            fichier.write(reponse)
     
     
     
        txtping.close()

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    il faut savoir que la branche 3 a pour buts principaux de standardiser et de corriger un certains nombre de soucis qui étaient présent sur la branche 2. Donc ne soit pas étonné dans ce sens.

    Concernant ton encodage, le message t'indique clairement une erreur unicode. Pourquoi ne pas utiliser un encodage UTF8 plutot que CP850? C'est ce qui est recommandé maintenant afin d'éviter tout soucis.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Membre régulier Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Points : 82
    Points
    82
    Par défaut
    bonjour

    pour une lecture du ping il faut l'encodage cp850
    je suis revenu en python 2 car j'avais un souci de compil, je vais voir pour remettre la 3 mais bon
    merci

  4. #4
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Avant de repasser en branche 3, ne pourrais tu essayer avec la branche 2, avec Unicode ou si impossible (je n'ai pas tout ton code, donc je ne peux tester pleinement) sans stipuler d'encodage? Cela permettrais eventuellement d'isoler si cela est bien la source du probleme ou non.

    Le caractère \xae, en unicode correspond au R dans un cercle (comme le C de copyright des logiciels). Quand on regarde la reponse que tu reçoit, on voit clairement que ta reponse contient des accents et c'est ça le vrai probleme.

    Quoiqu'il en soit, tu peux essayer de contourner le probleme avec une lib dediee au ping, comme par exemple pyping, dispo sur pypi.
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Essayez ceci :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # et NON PAS
    #_*_ coding:utf-8 _*_
     
    # Python 2.7.7
    # ------------------------------------------
    # Analyse de ping
    # ------------------------------------------
     
    from __future__ import unicode_literals
    import socket
    import subprocess
     
    def analyse_ping():
        """
            analyse d'une requête PING
        """
        ip = socket.gethostbyname(socket.gethostname())
        # envoie un ping à l'ordinateur
        # d'adresse ip, et retourne la réponse
        # sous forme d'une liste de lignes unicode
        # commande = ["ping", "-c", "1", ip] # UNIX/LINUX
        commande = ["ping", ip] # MS-Windows
        #~ os.system('echo Analyse en cours...') ???
        print("Analyse en cours...")
        try:
            #~ out, _ = subprocess.Popen(commande, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False).communicate()
            out = subprocess.check_output(commande)
        except Exception as err:
            #~ return ("Erreur: %s" % (err.args[0],)).decode(encodage)
            print("Erreur: {}".format(err))
            exit(1)
        # end try
     
        reponse = out.decode("cp850")
     
        print(reponse) # TRON console
     
        # EXporte le résultat dans fichier txt
        with open('ping.txt', 'w') as fichier:
            fichier.write(reponse.encode("utf-8"))
     
        print("PING enregistré dans fichier 'ping.txt': OK")
     
        #~ txtping.close() ???
     
    # end def
     
    # testing...
     
    analyse_ping()
    SVP, précisez quand vous travaillez sous MS-WINDOWS, ce n'est pas une évidence pour tout le monde.

    @+.

  6. #6
    Membre régulier Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Points : 82
    Points
    82
    Par défaut
    bonjour,

    oui se sont les accents qui pose problème, pour maintenant le code de tarball69, j'ai déjà essayé mais en plaçant sous variable
    comme reponse=reponse.encode("utf-8")

    mais rien à faire

    le code complet, en python 3, c'est bon mais pas en 2.7

    merci à vous deux


    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
    23
    24
    25
    26
    27
     
    #! /usr/bin/python
    #_*_ coding:utf-8 _*_
    # Python 2.7.7
    # ------------------------------------------
    # Analyse de ping
    # ------------------------------------------
     
    def analyse_ping():
        import socket,subprocess,os,sys
        ip = socket.gethostbyname(socket.gethostname())
        encodage="cp850"            
        # envoie un ping à l'ordinateur d'adresse ip, et retourne la réponse sous forme d'une liste de lignes unicode """  
        commande = ["ping ", ip]
        try:
            out, _ = subprocess.Popen(commande, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False).communicate()
        except (ValueError, OSError) as err:
            return ("Erreur: %s" % (err.args[0],)).decode(encodage)
     
        reponse = out.decode(encodage)
     
        # importe le résultat dans fichier txt
        with open('ping.txt', 'w') as fichier:
            fichier.write(reponse)
     
     
        txtping.close()

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Thierry_V Voir le message
    bonjour,

    oui se sont les accents qui pose problème, pour maintenant le code de tarball69, j'ai déjà essayé mais en plaçant sous variable
    comme reponse=reponse.encode("utf-8")

    mais rien à faire
    Avez-vous testé le code que je vous ai fourni TEL QUEL (lien "Sélectionner tout" puis copier/coller dans un fichier script sous IDLE, windows et Python 2.7, et enfin "Run script F5") ?

    Chez moi, sous Win 8 / Python 2.7 il fonctionne OK.

    Merci de cliquer si votre problème a trouvé solution.

    @+.

  8. #8
    Membre régulier Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Points : 82
    Points
    82
    Par défaut
    Bonjour

    Oui, ça fonctionne et en entête de programme l'erreur que vous me signaler était bien la faute.
    merci

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

Discussions similaires

  1. unicode encode error
    Par maissaab dans le forum Général Python
    Réponses: 3
    Dernier message: 03/09/2011, 19h07
  2. Lecture/ecriture fichier txt
    Par kmizgier dans le forum C
    Réponses: 5
    Dernier message: 07/12/2009, 21h12
  3. Lecture et ecriture fichier txt
    Par jeanmy dans le forum Delphi
    Réponses: 12
    Dernier message: 07/08/2006, 17h23
  4. PL/SQL lecture/ecriture fichier txt
    Par stos dans le forum PL/SQL
    Réponses: 2
    Dernier message: 19/05/2006, 12h19
  5. Probleme python 2.4 et matplotlib : unicode encode error
    Par patfrat dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 12/06/2005, 00h30

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