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 :

PYODBC encore un problème d'encodage


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut PYODBC encore un problème d'encodage
    Bonjour,
    j'aurais besoin de votre aide sur un problème "d'encoding" que je rencontre avec Python.

    J'utilise "WinPython-32bit-3.4.3.7" avec l'IDE SPYDER pour écrire le code Python

    Je souhaites faire des requêtes sql sur une base de données SQL SERVER et j'utilise le module PYODBC qui est fourni dans WINPYTHON.
    La connexion réussie et j'arrive à faire des requêtes basiques.
    ex:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT
      A.NAME AS [nom]
      B.JOB
    FROM
      CONTACTS A
        INNER JOIN ACTIVITY B ON (A.ID=B.ID)

    Mais quand je fais
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT
      A.NAME AS [nom]
      B.JOB AS [activités]
    FROM
      CONTACTS A
        INNER JOIN ACTIVITY B ON (A.ID=B.ID)

    je reçois le code d'erreur "'utf-8' codec can't decode byte 0xe9"
    Je recherche sur le net et constate que c'est un problème d'encoding en 'utf-8' mais pourtant j'ai à la première ligne du fichier
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-

    même en faisant
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    requete=u"""SELECT DISTINCT
      A.NAME AS [nom]
      B.JOB AS [activités]
    FROM
      CONTACTS A
        INNER JOIN ACTIVITY B ON (A.ID=B.ID)"""

    ça ne marche pas. Alors que quand je fais la console m'affiche correctement la requête dans la console.
    J'ai également testé
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    requetebis=requete.encode('utf-8')
    with conn.cursor() as cursor:
        cursor.execute(requetebis)
    mais sans plus de succès.

    Ensuite j'ai testé le code Python suivant:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def testencoding():
        print("sys.stdin.encoding: {}".format(sys.stdin.encoding))
        print("sys.getdefaultencoding: {}".format(sys.getdefaultencoding()))
        print("sys.getfilesystemencoding: {}".format(sys.getfilesystemencoding()))
        print("locale.getpreferredencoding: {}".format(locale.getpreferredencoding()))

    et j'obtiens dans la console IPython de SPYDER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sys.stdin.encoding: cp1252
    sys.getdefaultencoding: utf-8
    sys.getfilesystemencoding: mbcs
    locale.getpreferredencoding: cp1252
    dans la console Python normale de SPYDER j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sys.stdin.encoding: UTF-8
    sys.getdefaultencoding: utf-8
    sys.getfilesystemencoding: mbcs
    locale.getpreferredencoding: cp1252
    Selon vous d'où viendrait le problème? Et comment puis-je le résoudre s'il vous plaît?

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

    Citation Envoyé par wesjanson Voir le message
    Selon vous d'où viendrait le problème?
    Pas facile de savoir dans tout ce que vous racontez dans quelle condition vous récupérez l'erreur "'utf-8' codec can't decode byte 0xe9". Si c'est au lancement du script, c'est que l'instruction "# -*- coding: utf-8 -*-" qui indique à l'interpréteur Python comment décoder le script n'a pas été pris en compte par l'éditeur lors de la sauvegarde du fichier.

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

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Pas facile de savoir dans tout ce que vous racontez dans quelle condition vous récupérez l'erreur "'utf-8' codec can't decode byte 0xe9".
    Navré, le programme plante à la ligne où je fais la requête dans pyodbc
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute(requete)
    Je rappelle que ça ne plante que si je mets des caractères spéciaux (é,è,â,...) dans la variable requete.

  4. #4
    Membre éclairé
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Amateur
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 52
    Par défaut
    Pourrais-tu mettre un code entier minimaliste qui reproduise le problème ?

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Voilà.

    J'ai fait exprès de supprimer les identifiants de connexion à la base de données, Je ne veux pas les donner.
    En gras et souligné la ligne qui fait planter avec le message d'erreur: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 3: invalid continuation byte.

    Je sais que c'est la lettre "é" qui fait planter lorsque je change le nom de la table de résultat.

    Code Python : 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
    # -*- coding: utf-8 -*-
    
    import pyodbc
    
    def serversqlquery():
        strconn="DRIVER={SQL Server Native Client 10.0};SERVER=*XXX*;DATABASE=*XXX*;UID=*XXX*;PWD=*XXX*"
        return strconn
    
    def sqlquery():
        requete=u"""SELECT DISTINCT
      OBJ_ENT.ClassName,
      OBJ_ENT.PartNo as [Numéro]
    FROM
      EED_OBJ_Entity OBJ_ENT
    """
    #  OBJ_ENT.Temperature AS [Temperature (°C)]
        return requete
    
    def testsql():
        qry_columns=None
        try:
            #Connexion
            bd=pyodbc.connect(r''+serversqlquery(),unicode_results=True)
            with bd.cursor() as cursor:
                #Execution de la requete SQL
                cursor.execute(sqlquery())
                #Récupération des titres de colonnes des réponses de la requête SQL
                qry_columns = [i[0] for i in cursor.description]
        #except:
            
        finally:
            print(qry_columns)
        
    if __name__ == "__main__":
        testsql()

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Citation Envoyé par wesjanson Voir le message
    Navré, le programme plante à la ligne où je fais la requête dans pyodbc
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor.execute(requete)
    Je rappelle que ça ne plante que si je mets des caractères spéciaux (é,è,â,...) dans la variable requete.
    Vous passez une chaîne de caractères Unicode au driver ODBC.
    C'est lui qui doit se débrouiller à sérialiser çà avec l'encoding attendu par le serveur SQL qui sera derrière.

    Intuitivement, vous vous rendez compte que çà fait un tas de suspects autres que Python (qui se contente de balancer de l'Unicode) juste pour remplacer le nom d'une colonne (i.e. des meta-data) en ASCII ("job") par un alias non-ASCII '[activités]'.

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

Discussions similaires

  1. [Lazarus] Encore des problèmes d'encodage
    Par Francois_C dans le forum Lazarus
    Réponses: 6
    Dernier message: 07/01/2015, 10h02
  2. Encore un problème d'encodage de caractéres
    Par Memelo dans le forum Administration
    Réponses: 0
    Dernier message: 07/10/2010, 10h53
  3. Encore un problème d'encodage !
    Par Phonatacid dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 31/01/2010, 20h37
  4. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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