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 :

Souci d'encodage dans une définition


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Géomaticien (plutôt sur Arcgis...)
    Inscrit en
    Juillet 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Géomaticien (plutôt sur Arcgis...)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2013
    Messages : 49
    Par défaut Souci d'encodage dans une définition
    Bonjour,

    Je parcours des pages et des pages web sur l'encodage... Mais je finis toujours par m'y perdre.
    Là, entre un dictionnaire et une définition qui l'utilise, je ne m'en sort pas.

    Je travail sur un script avec les bibliothèques d'Arcgis (arcpy) et ma première ligne est # -*- coding: cp1252 -*-. Je suis en python 2.7.
    Je converti un tableau excel qui me revient du terrain en géodatabase Arcgis. Puis je lis les valeurs.
    Ces dernières remontent en unicode, ex; u'Ch\xeane', pour 'chêne'.
    Je veux retrouver mes codes machines en fonction de ses valeurs.
    J'ai donc un dictionnaire des essences forestières avec 1 code machine et un abréger.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dico_cle_ess ={u'Alisier blanc':("324",u'Ab'),u'Alisier Torminal':("323",u'At'),u'Aucune':("224",u'Aucune'),
        u'Aulne Blanc':("aul_b",u'Ab'),u'Aulne Glutineux':("116",u'Ag'),u'Bouleau pubescent':("97",u'Bp'),
        u'Bouleau verruqueux':("96",u'Bv'),
        u'Ch\xeane':("439",u'Q'),u'Ch\xeane p\xe9doncul\xe9':("56",u'Qp'),u"Ch\xeane rouge d'Am\xe9rique":("57",u'Qra'),
        u'Ch\xeane sessile':("68",u'Qs'),u'Divers':("310",u'Div'),
        u'Douglas':("111",u'Do'),u'Epic\xe9a commun':("100",u'Ec'), u'Erable champ\xeatre':("71",u'Ec'),u'Erable plane':("70",u'Ep'),u'Erable sycomore':("69",u'Es'),
        u'Fr\xeane commun':("80",u'Fc')}
    ...etc

    Si je fais un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico_cle_ess[u'Fr\xeane commun']
    Pas de soucis, j'ai la bonne réponse ; Mais comme je vais régulièrement interroger mon dictionnaire et que certaines essences anecdotiques peuvent ne pas être dedans. J'ai créé une définition pour gérer cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def code_ess(lib):
            try:
                return dico_cle_ess[lib][0].upper()
            except:
                print "ESSENCE non trouver"
            finally:
                return "224"
    Mais je n'ai que des retour avec le code '224'.
    J'ai donc fait des tests sans 'try/except':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def code_ess(lib):
    	print lib
     
            return dico_cle_ess[lib][0].upper()
    Et là, Oh! surprise !!! Le print dans ma définition, affiche non pas u'Fr\xeane commun', mais Frêne commun. Du coup, la clef de mon dico plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "<pyshell#53>", line 1, in <module>
        code_ess(u'Fr\xeane commun')
      File "<pyshell#48>", line 5, in code_ess
        return dico_cle_ess[repr(lib)]
    KeyError: "u'Fr\\xeane commun'"


    Est-ce ma variable 'lib' qui réencode ma variable d'origine ou seulement mon print?
    Pourquoi cherche-t-il une Key "u'Fr\\xeane commun'", alors que ma variable de départ ne contient pas 2 '\'?

    Auriez-vous quelques réponses svp? et/ou solutions svp? Je tourne en boucle là...

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

    Citation Envoyé par little_kevin Voir le message
    Pourquoi cherche-t-il une Key "u'Fr\\xeane commun'", alors que ma variable de départ ne contient pas 2 '\'?

    Auriez-vous quelques réponses svp?
    Si on écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> s = u'Fr\xeane commun'
    on demande à Python d'assigner à la variable s une chaîne de caractères unicode construite à partir de la suite de caractères littérale 'Fr\xeane commun'.
    Elle est littérale parce que codée en dur dans le "script" et donc dans le fichier correspondant. D'où la nécessite de préciser # -*- coding: cp1252 -*- et vous auriez pu écrire s = u'Frêne commun' et laisser votre éditeur de texte écrire le byte '\xea' dans le fichier (il sert à çà).

    Si on demande à Python d'afficher cette chaîne de caractère là avec print, çà affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print s
    Frêne commun
    Ca veut juste dire que la console à qui on a expédié le byte '\xea' sait afficher 'ê' à la place...
    Par contre, dans les messages d'erreur, Python utilise une autre représentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> repr(s)
    "u'Fr\\xeane commun'"
    ou le '\' est doublé car c'est un caractère d’échappement.

    En espérant que vous ayez un peu mieux compris qu'il ne sert à rien de vous appliquer à écrire '\xea' à la place de 'ê'.

    Citation Envoyé par little_kevin Voir le message
    Mais je n'ai que des retour avec le code '224'
    Ca c'est parce le sens de "finally" dans try...except... est de dire et dans tous les cas retourne 224. Et Python, docile le fait.

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

  3. #3
    Membre averti
    Homme Profil pro
    Géomaticien (plutôt sur Arcgis...)
    Inscrit en
    Juillet 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Géomaticien (plutôt sur Arcgis...)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2013
    Messages : 49
    Par défaut
    Merci.
    explication parfaitement claire
    Pour le print, je l'avais à peu prêt compris, mais cela confirme ma pensée.
    Pour l'erreur python, je comprend mieux l'affichage.

    Quand au try:
    Citation Envoyé par wiztricks Voir le message
    Ca c'est parce le sens de "finally" dans try...except... est de dire et dans tous les cas retourne 224. Et Python, docile le fait.
    - W
    Je pensais que le finally était utilisé que si le try avait remonté un échec. Du coup là, je dois simplement écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def code_ess(lib):
            try:
                return dico_cle_ess[lib][0].upper()
            except:
                print "ESSENCE non trouver"
                return "224"
    ça passe beaucoup mieux

    Car du coup je m'étais mis à inventer des tests genres return dico_cle_ess[lib.decode('UTF8')][0] , je comprend mieux pourquoi ce n'était finalement pas ma Key qui ne passait pas. La recherche de ma clé était bonne dans ma définition.

Discussions similaires

  1. probleme d'encodage dans une JSP
    Par ensisoft dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 29/05/2008, 16h54
  2. [Encodage] Souci de getParameter dans une request
    Par Max dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/12/2007, 08h47
  3. encodage dans une popup
    Par laloupiote dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/11/2007, 17h53
  4. Changer l'encodage dans une base existante
    Par zent dans le forum Oracle
    Réponses: 6
    Dernier message: 19/03/2007, 16h57
  5. Intégrer une variable dans une définition
    Par Death83 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/03/2006, 14h59

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