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 sous 2.7.3


Sujet :

Python

  1. #1
    Membre du Club Avatar de chaying
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 57
    Points
    57
    Par défaut unicode sous 2.7.3
    Bonjour

    J'ai le code suivant qui doit me faire un insert en database :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for dic in row:
        dic_statm = []
        for col in col_names:
            dic_statm.append('dic[\'' + col + '\']')    
        cur_exec = 'cur.execute(( ' + ' , '.join(dic_statm) + ' ))'
     
        print cur_exec
        exec cur_exec
    resultat : print cur_exec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cur.execute(( dic['name'] , dic['définition'] ))
    Ma locale m'imprime ce que je veux mais l'utilisation de encode('UTF-8') ou decode('UTF-8') sur cur_exec n'y ont rien fait, j'obtiens toujours le traceback suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
        exec cur_exec
      File "<string>", line 1, in <module>
    KeyError: 'd\xc3\xa9finition'
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Rajoutes au début de ton script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-

  3. #3
    Membre du Club Avatar de chaying
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    Salut Enerian

    Desole, j'aurais du le mentionner mais mon en-tete est correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #! /usr/bin/env python
    # -*- coding: UTF-8 -*-

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 435
    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 435
    Points : 37 020
    Points
    37 020
    Par défaut
    Salut,
    La déclaration "# -*- coding: utf-8 -*-" sera utilisée par l’interpréteur pour savoir comment traduire les caractères non-ASCII du script. Comme il n'y en a pas dans le code montre, avec ou sans ne change rien.
    Par contre, l'erreur KeyError: 'd\xc3\xa9finition' indique que la clé "définition" est représentée sous la forme de bytes utf-8 plutôt qu'en Unicode.
    On ne sait pas trop comment vous avez construit les clés du dict mais il faut choisir bytes ou Unicode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> key = 'définition'
    >>> key
    'd\x82finition'
    >>> key = u'définition'   notez le u
    >>> key
    u'd\xe9finition'
    >>> key.encode('utf-8')
    'd\xc3\xa9finition'
    Et éviter ce genre de construction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for dic in row:
        dic_statm = []
        for col in col_names:
            dic_statm.append('dic[\'' + col + '\']')    
        cur_exec = 'cur.execute(( ' + ' , '.join(dic_statm) + ' ))'
     
        print cur_exec
        exec cur_exec
    => s'assurer que toutes les variables sont des str Unicode,
    => faire qu'elle le restent = ne pas oublier le u

    Faire faire le boulot de conversion des objets Python par la DBAPI plutôt que batailler pour le faire vous même et mal.
    - W

  5. #5
    Membre du Club Avatar de chaying
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    Bonjour Double You

    Merci de vous arreter sur mon post.

    Alors j'ai relu la doc Python sur le sujet au cas ou j'aurais loupe plus que de mesure et, je comprends bien ce que vous me dites - ce qui est rassurant, vu que c'etait en francais. Mais c'est le comportement du code que je ne comprends toujours pas.

    Je l'ai donc modifie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for dic in row:
        dic_statm = []
        print 'col_names :', col_names  
            for col in col_names:
                dic_statm.append('dic[\'' + col + '\']')
            print 'dic_statm :',dic_statm     
        cur_exec = 'cur.execute(( ' + ' , '.join(dic_statm) + ' ))'
     
        # prepare query
        print 'cur_exec :', cur_exec
        exec cur_exec
    Et obtiens donc le resultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    row : [{u'name': u'accumulator'}, {u'd\xe9finition': u'A variable used in a loop to accumulate a series of values, such as by concatenating them onto a string or adding them to a running sum. '}]
     
    col_names : [u'name', u'd\xe9finition']
     
    dic_statm : [u"dic['name']", u"dic['d\xe9finition']"]
     
    cur_exec : cur.execute(( dic['name'] , dic['définition'] ))
     
     
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    KeyError: 'd\xc3\xa9finition'
    Et la, on s'apercoit que "définition" se presente sous 3 formes differentes et ca : je ne comprends pas pourquoi.

    De plus, vous me dites "Et éviter ce genre de construction", mais c'est la seule solution que j'ai trouve pour construire une requete INSERT (psycopg2 prepared query) en ne sachant pas le nombre de valeurs a inserer a l'avance.

    Merci

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

    Citation Envoyé par chaying Voir le message
    Et la, on s'apercoit que "définition" se presente sous 3 formes differentes et ca : je ne comprends pas pourquoi.
    Je comprend qu'il soit frustrant de ne pas comprendre pourquoi votre suite d’opérations proposée ne fonctionne pas alors qu'elle parait si simple.

    Rapidement, vous utilisez des chaînes de caractères pour échanger des messages. US-ASCII imprimable est la seule façon d’échanger des chaînes de caractères sans "transformation" et donc de façon intègre.
    Écrivez "définition": comment représenter le "é"? Ce n'est pas un caractère US ASCII. En France, les choix de base sont dans les dialectes: latin-1, utf-8, Unicode.
    Prenez 3 chaînes de caractères A, B, C code dans chacun des 3 dialectes.
    • Que signifie concaténer A et B?
    • Rechercher 'é' dans A + B + C?

    La règle est de représenter toutes ces variables internes en Unicode.
    Lorsque leur contenu doit être transféré a l’extérieur du programme, on applique .encode et .decode dans le dialecte qui va bien.
    A vous de mettre en place un service de "douane" pour transformer ce qui entre et ce qui sort. La police des frontières, les gabelous, ... le contrôle des routes, ports et des ponts: une organisation moyenageuse mais efficace!

    Python2 laisse au programmeur la liberté d’être indiscipline: on peut mettre dans une variable des séquences de bytes et d'unicode. Il a la charge de préciser ce qui doit être fait. Par défaut, ça fait "n'importe quoi".

    Python3 travaille avec de l'Unicode.
    Le contrôle de la frontière est "battery included": i.e. par défaut., ce qui entre et sort sera sérialise d'Unicode en utf-8. Pour d'autres dialectes: latin-1,... il faudra (peut être) préciser.

    Pourquoi perdre du temps a expliquer le pourquoi d'une organisation du code dans ce cas? Les explications techniques sont la, mais elles sont difficilement accessibles au débutant.
    Que faire pour "masquer" de tels sujets sans bloquer votre progression? Python3 est une solution.

    - W

  7. #7
    Membre du Club Avatar de chaying
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    La règle est de représenter toutes ces variables internes en Unicode.
    Lorsque leur contenu doit être transféré a l’extérieur du programme, on applique .encode et .decode dans le dialecte qui va bien.
    A vous de mettre en place un service de "douane" pour transformer ce qui entre et ce qui sort. La police des frontières, les gabelous, ... le contrôle des routes, ports et des ponts: une organisation moyenageuse mais efficace!
    Je voulais vous remercier pour votre temps et vos explications. J'ai repris tout le code et maintenant ca marche, donc : vive le moyen-age !

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 435
    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 435
    Points : 37 020
    Points
    37 020
    Par défaut
    Citation Envoyé par chaying Voir le message
    Je voulais vous remercier pour votre temps et vos explications. J'ai repris tout le code et maintenant ca marche, donc : vive le moyen-age !
    "vive le moyen-age", hmmm.
    Les premiers pas de la POO passent pas la définition d’entités: un boite avec un nom et des rôles et responsabilités qui en délimitent le contour. I
    Ici, la boite n'est pas "class" mais traduit un programme en cours d’exécution qui échange des streams de bytes (le contenu de fichiers) avec l’extérieur.
    Ces streams pouvant être codes de plusieurs façons, on se retrouve dans une situation de "complexité".
    Imaginons P1, P2, ..., PN parlant différentes langues. Pour communiquer, chaque personne devrait parler N langues.
    Si on traduit ces communications en "arcs", il en faudrait de l'ordre de (N * N - 1) / 2: la complexité sera en O(N**2).
    Pour simplifier, on invente une médiation M qui fera le boulot de traduction. Cote "arcs", il n'y en a plus que N: la complexité étant maintenant en O(N) sera plus facile a gérer.

    Le raisonnement reste valable en appliquant M a:
    • un territoire,
    • une monnaie,
    • une langue,
    • un format de document,
    • des protocoles réseaux,
    • un environnement système (Windows, Linux, ...)
    • unicode,
    • ...

    Ce sont des "standards" qui s'appliquent a un contexte.
    C'est aussi un pattern d'architecture logicielle: URL="http://sourcemaking.com/design_patterns/mediator"]mediator pattern[/URL]

    - W

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

Discussions similaires

  1. [Généralités] Adopter Unicode sous Windev 18 et suivants : oui ou non ?
    Par Hemgé dans le forum WinDev
    Réponses: 2
    Dernier message: 17/11/2013, 10h02
  2. Support de Unicode sous Windows
    Par vincent-v dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 19/08/2011, 23h26
  3. Champ Unicode sous Firebird
    Par NorexaMS dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/03/2011, 23h18
  4. Réponses: 1
    Dernier message: 22/04/2008, 18h49

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