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 :

Probleme avec l encoding


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut Probleme avec l encoding
    Bonjour,

    Je reviens vers vous a propos de mon petit programme de gestion d'associations depuis bdd.Il y a peu j'ai eu un souci avec un caractère intempestif '\', que j'ai pu régler en gérant le formatage de mes champs par une petite routine.

    Aujourd'hui j'ai a nouveau un problème avec la gestion des caractères bien que mon programme soit fonctionnel. En effet jusqu'alors j'ai développé sans me soucier des caractères accentués, soit en rentrant mes données sans utiliser les accents. Or je me suis dit qu'il faudrait avoir une approche user-friendly et patatrac tout a planté. J'ai recherché sur Internet des réponses, que j'ai trouvées, mais qui ne semble pas fonctionner. En résumé j'utilise pour toutes mes données saisies la fonction decode('utf8') et en sortie encode('utf8').'autres tuto m'ont permis d'extraire le charset utilisé grâce à la fonction sys.sdtout.encoding que j'ai utilisé pour encodé par la suite. Mais malgré toutes mes lectures,ça ne fonctionne pas, mes caractères accentués ne sont pas codés ni décodés.

    Après de nombreux tests, j'ai pu enregistrer dans la bdd des champs qui conservaient les hiéroglyphes style "\xe9" en lieu et place des caractères accentués. Cependant quand j'utilise un curseur comme curs.execute(requete),pour récupérer les donées, cela plante sur le champ concerné. Je vous mets le code associé,qui est une réduction de mon code original et que j'utilise pour tester le bon encodage:
    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
     
    choixmenu=""
    schoixmenu=""
    maintenance=[schoixmenu,"evenements","2","",choixmenu,"","","True",""]
    cles=("Num_evnmt","type_evnmt","libelle_evnmt","date_evnmt","lieu_evnmt","participation_evnmt","droit_entree_evnmt","resume_evnmt")
    libelles=("le numero d ordre","le type","nom de l evenement","la date","le lieu","la participation","le prix","resume")
    lstmenu=[maintenance,cles,libelles]
    #---------------------------------------------
    lstsaisie_fiche=[]
    for valeur in lstmenu[2]:
        donnee=raw_input("Choisir {} :".format(valeur)).strip()
        while donnee="":
            donnee=raw_input("Choisir {} :".format(valeur)).strip()
        lstsaisie_fiche.append(donnee)
    lstmenu.append(lstsaisie_fiche)
    #----------------------------------------------
    reqsaisir="insert into {} values({})"
    lien=lstmenu[0][1]
    phrase=""
    mot=""
    index=0
    for valeur in lstmenu[3]:
        if index<len(lstmenu[3])-1:
            mot+="'"+valeur+"'"+","
        else:
            mot+="'"+valeur+"'"
        phrase+=mot
        index+=1
     
    requete=reqsaisir.format(lien,phrase)
    Pour résumé, dans mon programme je gère des assoss qui ont des liens entre elles.Pour cela je propose dans le menu Saisir,Modifier,Rechercher et Supprimer.Je récupère une définition des tables et une liste maintenance qui m'aidera a faire différents calculs et a le conserver, et j encapsule le tout dans une variable lstmenu que je fournirai a chaque appel de fonction utile. Le code ci-dessus permet de faire la saisie d une nouvelle fiche et après de créer la requête insert qui doit alimenter ma base sqlite3. Mais voila ça plante a cause de l'encodage.

    Je vous demande de l'aide car malgré mes tests, je n'arrive pas a valider un string propre pour mes requêtes.

    Merci bien.

    Cordialement

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

    Citation Envoyé par estrasse Voir le message
    Je vous demande de l'aide car malgré mes tests, je n'arrive pas a valider un string propre pour mes requêtes
    Si on vous a déjà dit de travailler en Unicode et de laisser le pilote du SGDB faire le boulot de sérialisation, c'est parce que faire ce boulot à la minime était suffisamment ardu pour que çà vaille le cout d'apprendre à utiliser proprement les fonctionnalités du pilote du SGDB.

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

  3. #3
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 485
    Par défaut
    Est tu "contraint" à Python 2?

    Parce que l'avantage principale de Python 3 c'est justement de bien mieux gérer l'encodage.
    En Py3, toutes les chaînes sont par défaut en utf-8.

    En tout cas, inclus en entête de ton module python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    Cela évitera de devoir préfixé toute tes chaînes par u'......' et ça te rendra plus proche de Py3 si tu veux être compatible entre les deux.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut
    Bonjour,

    Merci Laurent 1973 pour ta contrib.J'ai testé et ça ne m'aide pas plus.J'ai suivi ce tuto http://sametmax.com/lencoding-en-pyt...is-pour-toute/ et je n'y arrive pas malgré tout.

    Mon idle, sqlite3sont en utf8,mon terminal est en cp1252,le système de fichier en mbcs.Bien entendu j'ai mis le commentaire en début de page de code comme conseillé et c'est systématique.Chaque entrée que j'effectue par un raw_input je fais un decode('utf-8'),j'enregistre dans la bdd ma requête en unicode, les hiéroglyphes ne posant pas de problème. Quand je fais une requête select, j'effectue mes print avec donnee.encode('UTF-8'). J'ai même testé avec le decode('cp1252')/encode('cp1252') mais j'ai soit des plantages de gestion soit d’écriture dans la bdd soit d'affichage.Je suis noob en la matière mais tout ce que j'ai lu me ramène a décode()/encode().Je ne vois pas ce que je fais mal.

    Si on vous a déjà dit de travailler en Unicode et de laisser le pilote du SGDB faire le boulot de sérialisation, c'est parce que faire ce boulot à la minime était suffisamment ardu pour que çà vaille le cout d'apprendre à utiliser proprement les fonctionnalités du pilote du SGDB.
    Je ne vois pas trop où chercher ce dont vous faites référence.Pourriez vous me donner un lien svp.Je comprends bien que ce soit agaçant pour vous ces questions de débutant mais étant à un bon paquet d'heures de recherches,je suis complètement bloqué par cette saloperie de codage.

    Quant a python3, je n'ai pas essayé car j'ai été familiarisé sur 2.7 pendant ma petite auto formation avec France université numérique.

    Je ne sais pas si ça peut avoir un rapport mais je fais tout tourner sur du xp pro.
    Je ne sais plus que lire pour passer cette étape.
    Un dernier mot "AU SECOURS!".decode()...

    Merci pour votre aide et bon week end

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

    Citation Envoyé par estrasse Voir le message
    Je ne vois pas trop où chercher ce dont vous faites référence.Pourriez vous me donner un lien svp.Je comprends bien que ce soit agaçant pour vous ces questions de débutant mais étant à un bon paquet d'heures de recherches,je suis complètement bloqué par cette saloperie de codage.
    Le module sqlite3 vient en standard avec Python.

    Je veux bien passer du temps pour vous aider à comprendre comment construire des requêtes avec paramètres, i.e. des choses de la forme "c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)" mais si vous voulez perdre votre temps à vouloir ré-inventer la roue, c'est votre problème.

    Et si vous aviez suivi le tuto de sam&max, vous y auriez trouvé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        # ici je peux faire des traitements divers et varié avec ma chaîne
        # et en fin de programme...
     
        # la lib sqlite convertie par défaut tout objet unicode en UTF8
        # car c'est l'encoding de sqlite par défaut donc passer des chaînes
        # unicode marche, et toutes les chaînes de mon programme sont en unicode
        # grace à mon premier import
        c.execute("""INSERT INTO pages (nom, html) VALUES (?, ?)""", (nom, html))
    Après, c'est du code. Il faut prendre le temps de comprendre ce qu'il fait, pourquoi...


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

Discussions similaires

  1. python : probleme avec .encode("hex")
    Par cosmoff dans le forum Général Python
    Réponses: 7
    Dernier message: 12/06/2015, 08h58
  2. [Integration] Probleme avec Char Encoding
    Par nicdo77 dans le forum Spring
    Réponses: 6
    Dernier message: 15/01/2008, 10h48
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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