OVH Cloud OVH Cloud

[newbie] chaine unicode

11 réponses
Avatar
frouty
Bonjour,

Je récupère les champs de 2 wx.TextControl via un wx.Validator dans un
magnifque dictionnaire appelons le dict.

>>>print dict
{'nom':u'Machepro', 'prenom':u'Isidor'}
^ ^

Déjà je sais pas trop pourquoi j'ai de l'unicode?
Mais cela n'est pas mon probleme majeur.

Je veux insérer ces 2 champs dans une base de données Postgresql avec
psychopg2.

Je fais:


# -*- coding: latin-1 -*-

import wx
import psycopg2
import pprint
import psycopg2.extras

##--Realisation de la connection a la
##--base donne

try:
dbcon=psycopg2.connect("dbname='mabase' user='unuser'
host='localhost'")
print "A priori la connection est un succes"


except:
print "La connection a choue"

##--Creation d'un cursor

dbcur=dbcon.cursor(cursor_factory=psycopg2.extras.DictCursor)

[blablabla wxPython]


try:
cursor.execute("INSERT INTO matable(nom,prenom)
VALUES(%(nom)s,%(prenom)s", dict)
print "juvabien juvamine"
exept:
print "oooopsssss!"

Bah ca marche pas et il n'y a pas de message d'erreur ou plutot
je ne l'ai pas trouvé, alors que d'habitude python est plutot bavard
quand je fais une boulette.

J'ai trouvé des posts mais ça ne m'aide pas c'est pour cela que je fais
appel à la python force.

Merci

10 réponses

1 2
Avatar
elGringo
Bonjour.
Change le nom de ton dictionnaire, dict est un mot reservé de python.
Peut-etre n'est-ce que ça.

Pythoniquement.
Avatar
jean-michel bain-cornu
Bonjour,
try:
cursor.execute("INSERT INTO matable(nom,prenom)
VALUES(%(nom)s,%(prenom)s", dict)
C'est louche ; sauf erreur je mettrais plutôt : ...%(prenom)s"%dict)

print "juvabien juvamine"
exept:
print "oooopsssss!"

Bah ca marche pas et il n'y a pas de message d'erreur ou plutot
je ne l'ai pas trouvé, alors que d'habitude python est plutot bavard
quand je fais une boulette.
Est-ce vraiment le code réel ? On devrait avoir 'except' à la place de

'exept'.
Le fait de mettre un 'except:' brut de fonderie te cache l'erreur
réelle. Tu devrais utiliser 'raise' afin de forcer l'affichage de ce qui
est arrivé. Exemple :
except:
print "oooopsssss!"
raise
C'est encore mieux de piéger une ou plusieurs erreur explicitement, ce
qui te permet de voir les erreurs que tu n'a pas prévues. Exemple :
except AttributeError:
print "oooopsssss!"
Peut-être qu'en appliquant ceci tu en sauras plus sur la cause de ton
problème ?
A+
jm

Avatar
jean-michel bain-cornu
try:
cursor.execute("INSERT INTO matable(nom,prenom)
VALUES(%(nom)s,%(prenom)s", dict)
C'est louche ; sauf erreur je mettrais plutôt : ...%(prenom)s"%dict)

Voire même : VALUES('%(nom)s','%(prenom)s'"%dict)



Avatar
Eric Brunel
On Thu, 23 Nov 2006 07:08:17 +0100, frouty
wrote:
[snip]
Bah ca marche pas et il n'y a pas de message d'erreur ou plutot
je ne l'ai pas trouvé, alors que d'habitude python est plutot bavard
quand je fais une boulette.


Ca veut dire quoi "ça marche pas"? Quel est le résultat? Quel est celui
que tu attendais?

Quelques remarques sur ton code:
1. Le "# -*- coding: latin-1 -*-" au début ne sert à rien,
puisqu'apparemment, tu n'as aucune chaîne contenant des caractères
accentués dans ton code.
2. Ca ne peut pas être le code que tu utilises puisque le dernier
"except:" est écrit "exept:" et provoque donc une erreur de syntaxe. Si tu
veux avoir une aide efficace, copie/colle ton *vrai* code; ne le ré-écrit
pas.
3. Evite les clauses except "sèches", c'est à dire sans nom d'exception
derrière. Elles peuvent masquer une erreur dans ton code (genre
AttributeError) que tu aurais pourtant bien envie de connaître.
4. A quoi sert la dernière clause "except"? Récupérer une exception avec
sans doute une description précise pour juste mettre un message d'erreur
générique qui ne dit rien de ce qui se passe ne me paraît pas être une
super-idée...
5. Je ne connais pas l'interface bdd que tu utilises, mais je suppose que
le cursor.execute finit par résoudre les %(quelque-chose)s avec un
opérateur %. Si tel est bien le cas, notes que 'x%s' % u'y' renvoie une
chaîne unicode et vérifie s'il est possible d'écrire une requête sous
forme de chaîne unicode dans un cursor.execute.
Si c'est ça le problème et qu'il a été masqué par ta clause except
"sèche", tu copieras 500 fois "je n'écrirai plus jamais de clauses except
sans nom d'exception derrière" ;-)

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"

Avatar
jean-michel bain-cornu
Si c'est ça le problème et qu'il a été masqué par ta clause except
"sèche", tu copieras 500 fois "je n'écrirai plus jamais de clauses
except sans nom d'exception derrière" ;-)
A moins de faire un raise sec aussi...


Avatar
frouty
Le Thu, 23 Nov 2006 09:23:11 +0100, Eric Brunel a écrit:

On Thu, 23 Nov 2006 07:08:17 +0100, frouty
wrote:
[snip]
Bah ca marche pas et il n'y a pas de message d'erreur ou plutot
je ne l'ai pas trouvé, alors que d'habitude python est plutot bavard
quand je fais une boulette.


Ca veut dire quoi "ça marche pas"? Quel est le résultat? Quel est celui
que tu attendais?

Quelques remarques sur ton code:
1. Le "# -*- coding: latin-1 -*-" au début ne sert à rien,
puisqu'apparemment, tu n'as aucune chaîne contenant des caractères
accentués dans ton code.


Sisi il y en a c'était pour simplifier je voulais pas mettre tout le code.

Mais je vois que je pensais mal

2.copie/colle ton *vrai* code; ne le
ré-écrit pas.


Bon d'accord:
# -*- coding: latin1 -*-

### Mini projet wxpython
### juste un formulaire avec Nom/prenom
### dbname=mabase
### dbuser=auser
### dbtable=repert avec id|nom|prenom

import wx
import psycopg2

import pprint
import psycopg2.extras
import psycopg2.extensions
##--Réalisation de la connection a la
##--base donnée = mabase

try:


dbcon=psycopg2.connect("dbname='mabase' user='auser' host='localhost'")
print "A priori la connection est un succés"


except:
print "La connection a échoué"

##--Création d'un cursor
dbcurÛcon.cursor(cursor_factory=psycopg2.extras.DictCursor)

##--Création du formulaire de saisi du nom|prenom
class SaisiPatient(wx.Dialog):
"""Dialog pour formulaire de saisie nom, prenom
"""
def __init__(self,parent,data):
wx.Dialog.__init__(self,parent,-1)
self.dataÚta

##--Création des étiquettes
about = wx.StaticText(self, -1, "Saisi patient")
nomlbl = wx.StaticText(self, -1, "Nom")
prenomlbl = wx.StaticText(self,-1, "prénom")
##--Creation des controles
nom = wx.TextCtrl(self,-1,"",validator=ValSaisiPatient(self.data,"nom"))
prenom = wx.TextCtrl(self,-1,"",validator=ValSaisiPatient(self.data,"prenom"))

##--Création des boutons Valider|Annuler
validbtn=wx.Button(self,wx.ID_OK)
annulbtn=wx.Button(self,wx.ID_CANCEL)
validbtn.SetDefault()
###Création du sizer
mainsizer=wx.BoxSizer(wx.VERTICAL)

##--Création d'un flexigrid 2 lignes 2 colonnes
namesizer=wx.FlexGridSizer(2,2,5,5)
namesizer.AddGrowableCol(1)
namesizer.Add(nomlbl)
namesizer.Add(nom,1,wx.EXPAND)
namesizer.Add(prenomlbl)
namesizer.Add(prenom,1,wx.EXPAND)


##--Creation du sizer des boutons
btnsizer=wx.StdDialogButtonSizer()
btnsizer.AddButton(validbtn)
btnsizer.AddButton(annulbtn)
btnsizer.Realize()
##--Peuplement du sizer vertical
mainsizer.Add(about,0,wx.EXPAND)
mainsizer.Add(namesizer,0,wx.EXPAND)
mainsizer.Add(btnsizer,0,wx.EXPAND)

self.SetSizer(mainsizer)
mainsizer.Fit(self)


##--Définition des validateurs
##dans un premier pour uniquement récupérer les données

class ValSaisiPatient(wx.PyValidator):
"""Validator pour la récupération des donées tapées
par l'utiilisateur afin d'en faire un dictionnaire.
"""
def __init__(self,data,key):
wx.PyValidator.__init__(self)
self.dataÚta
self.key=key
print "self.key = %s et self.data = %s" %(self.key, self.data)

def Clone(self):
return ValSaisiPatient(self.data,self.key)

def Validate(self,win):
return True

def TransferToWindow(self):
return True

def TransferFromWindow(self):
txtctl=self.GetWindow()
self.data[self.key]=txtctl.GetValue()
print "self.data = %s" %(self.data,)
print
return True

##--Création de la fenêtre pincipale
##--avec menu: patient/nouveau
class MainFrame(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self,None,-1,"Repertoire")

##--Création d'un panel pour contenir les menus
self.panel=wx.Panel(self)
##--Creation de la barre de status
statusbar=self.CreateStatusBar()
##--Creation de la barre de menu
menubar=wx.MenuBar()
##--Creation du menu "patient"
patient=wx.Menu()
##--Peuplement de la barre de menu
menubar.Append(patient,"Patient")
##--Creation de l'item de menu "nouveau"
nouveau=patient.Append(wx.NewId(),"Nouveau","Saisir un nouveau patient")
#--Poursuite peuplement du menu: Patient
patient.AppendSeparator()
quitte=patient.Append(wx.NewId(),"Quitter","Quitte l'application")

##--Mise en place de la barre de menu
self.SetMenuBar(menubar)

##--A ce stade le programme la connection s'effectue
## il affiche la frame
##--Liaison des menus aux events
self.Bind(wx.EVT_MENU, self.OnNouveauPatient,nouveau)
self.Bind(wx.EVT_MENU, self.OnQuitte, quitte)

##--Creation des réponse au choix de l'utilsateur
##--fait sur les menus

def OnNouveauPatient(self,evt):
print """Vous avez choisi d'enregistrer un nouveau patientn
j'affiche le formulaire de saisie"""
dlg=SaisiPatient(self,data)
dlg.ShowModal()
dlg.Destroy()
print "le type de dlg.data est:"
print type(dlg.data)
print " sa valeur est:"
print dlg.data
#wx.MessageBox("vous avez saisi %(nom)s %(prenom)s :" %dlg.data)
##--Realisation du transfert de ces données vers la table
try:
dbcur.execute('select * from repert')
print "la table:"
print dbcur.fetchall()
print "le type de dlg.data est:"
print type(dlg.data)
print "la valeur de dlg.data est:"
print dlg.data
print "la valeur de nom est:"
print dlg.data['nom']
print "le type de nom est:"
print type(dlg.data['nom'])
dbcur.execute("insert into repert(nom,prenom) values(%(nom)s,%(prenom)s)",dlg.data)
except AttributeError:
print "oooppssss!"


def OnQuitte(self,evt):
self.Destroy()

##--Le main Loop
if __name__=='__main__':
app=wx.PySimpleApp()
data={"nom":"","prenom":""}
frame=MainFrame(None)
frame.Show(True)
app.MainLoop()


##########

Grace a except AttributeErrror je lève l'erreur suivant:

le type de nom est:
<type 'unicode'>
Traceback (most recent call last):
File "<stdin>", line 164, in OnNouveauPatient
File "/usr/lib/python2.4/site-packages/psycopg2/extras.py", line 48, in execute
return _cursor.execute(self, query, vars, async)
psycopg2.InterfaceError: can't encode unicode string to LATIN9



3. Evite les clauses except "sèches", c'est à dire sans nom d'exception
derrière. Elles peuvent masquer une erreur dans ton code (genre
AttributeError) que tu aurais pourtant bien envie de connaître.
En fait je mets rien car vu mon niveau en python je n'ai pas la moindre

idée du petit nom du type d'erreur qui peur le plus probablement sortir

4. A
quoi sert la dernière clause "except"? Récupérer une exception avec sans
doute une description précise pour juste mettre un message d'erreur
générique qui ne dit rien de ce qui se passe ne me paraît pas être une
super-idée...


Je sais c'est naze. ca m'aide peut etre un peu à localiser vers se passe
le probleme dans mon code

5.tu copieras 500 fois "je n'écrirai plus
jamais de clauses except sans
nom d'exception derrière" ;-)


C'est fait

HTH



Avatar
Olivier Ravard
frouty wrote:
Bonjour,

Je récupère les champs de 2 wx.TextControl via un wx.Validator dans un
magnifque dictionnaire appelons le dict.

print dict
{'nom':u'Machepro', 'prenom':u'Isidor'}



^ ^

Déjà je sais pas trop pourquoi j'ai de l'unicode?
Mais cela n'est pas mon probleme majeur.



C'est parce que tu as installé wx-unicode.




Avatar
frouty
C'est parce que tu as installé wx-unicode.


Bon d'accord. Mais moi j'ai rien demandé.

C'est wxpython qui doit faire ca automatiquement?

J'ai juste: import wx

Avatar
Eric Brunel
On Thu, 23 Nov 2006 13:28:00 +0100, frouty
wrote:
[snip]
Traceback (most recent call last):
File "<stdin>", line 164, in OnNouveauPatient
File "/usr/lib/python2.4/site-packages/psycopg2/extras.py", line 48,
in execute
return _cursor.execute(self, query, vars, async)
psycopg2.InterfaceError: can't encode unicode string to LATIN9


Donc tu as la solution a ton problème: vu que psycopg2 attend apparemment
un encodage en latin9 (a.k.a iso8859-15), il te suffit d'encoder le
contenu de ton dictionnaire en iso8859-15 avant de le passer à ton
cursor.execute, en faisant par exemple:

for k in dlg.data:
dlg.data[k] = dlg.data[k].encode('iso8859-15')

3. Evite les clauses except "sèches", c'est à dire sans nom d'exception
derrière. Elles peuvent masquer une erreur dans ton code (genre
AttributeError) que tu aurais pourtant bien envie de connaître.
En fait je mets rien car vu mon niveau en python je n'ai pas la moindre

idée du petit nom du type d'erreur qui peur le plus probablement sortir


Alors pourquoi mets-tu un try/except? Et tu n'as pas compris ce que je
voulais dire: "except AttributeError" est exactement ce que tu ne veux
pas. Une exception AttributeError est levée par une tentative d'accès à un
attribut qui n'existe pas, résultant en général d'un faute de frappe. Donc
si tu mets un "except AttributeError", tu ne verras jamais si tu fais des
fautes de frappe: ton script continueras à tourner comme si de rien
était...

4. A
quoi sert la dernière clause "except"? Récupérer une exception avec sans
doute une description précise pour juste mettre un message d'erreur
générique qui ne dit rien de ce qui se passe ne me paraît pas être une
super-idée...


Je sais c'est naze. ca m'aide peut etre un peu à localiser vers se passe
le probleme dans mon code


Pardon!? En désactivant le traceback qui te dit exactement où est l'erreur
et en mettant un 'print "oops"' à la place, ça t'aide???

De façon générale, ne cherches pas à te protéger de tout ce qui peut
arriver au premier jet. Tu auras bien le temps de voir plus tard quels
sont les types d'exception que tu récupères (le type apparaît toujours
dans le traceback) et tu pourras décider à ce moment là quoi faire quand
elles arrivent.

5.tu copieras 500 fois "je n'écrirai plus
jamais de clauses except sans
nom d'exception derrière" ;-)


C'est fait


Même pas vrai ;-)

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"


Avatar
frouty
Le Thu, 23 Nov 2006 15:58:29 +0100, Eric Brunel a écrit:

On Thu, 23 Nov 2006 13:28:00 +0100, frouty
wrote:
[snip]
Traceback (most recent call last):
File "<stdin>", line 164, in OnNouveauPatient
File "/usr/lib/python2.4/site-packages/psycopg2/extras.py", line 48,
in execute
return _cursor.execute(self, query, vars, async)
psycopg2.InterfaceError: can't encode unicode string to LATIN9


Donc tu as la solution a ton problème: vu que psycopg2 attend apparemment
un encodage en latin9 (a.k.a iso8859-15), il te suffit d'encoder le
contenu de ton dictionnaire en iso8859-15 avant de le passer à ton
cursor.execute, en faisant par exemple:

for k in dlg.data:
dlg.data[k] = dlg.data[k].encode('iso8859-15')

J'avais un peu deviné qu'il failler encoder ou decoder les values.

Mais bon j'avais pas trouvé ces 2 lignes hypra simples.

J'etais parti sur des for v in dlg.data.values() ....bref

Alors pourquoi mets-tu un try/except? Et tu n'as pas compris ce que je
voulais dire: "except AttributeError" est exactement ce que tu ne veux
pas. Une exception AttributeError est levée par une tentative d'accès à un
attribut qui n'existe pas, résultant en général d'un faute de frappe. Donc
si tu mets un "except AttributeError", tu ne verras jamais si tu fais des
fautes de frappe: ton script continueras à tourner comme si de rien
était...


J'ai du mal à comprendre je vais y reflechir c'est pas du tout ce que
j'avais compris du try/except d'apres ce que j'avais lu. Mais je comprends
mal donc

Pardon!? En désactivant le traceback qui te dit exactement où est
l'erreur et en mettant un 'print "oops"' à la place, ça t'aide???


J'aurai mieux fait de ne pas mettre try...except?
Au moins au premier jet?

Même pas vrai ;-)
Si un peu vu le nombre de fois ou je modifie/relance

mon programme.

Bon bah merci c'est résolu.


1 2