OVH Cloud OVH Cloud

drole d'erreur

13 réponses
Avatar
Almaleh
Bonjour,

J'ai le code suivant (une partie)(peu importe ce que ca fait à vrai
dire)

var1="\"%s\",\"%s\"\r\n" % (a,motrie)
dest.write(var1)

Ca me génère une erreur : KeyError: '\xeb'

Si je mets print var1 entre les deux lignes, le programme tourne
normalement. Bizarre. Une idee ??

merci
Francois A.

--
Francois A.
_________

Excellent newsreader : http://mesnews.no-ip.com

3 réponses

1 2
Avatar
Bruno Desthuilliers
Bonjour, très sincèrement, il est fortement improbable que l'erreur
vienne d'un bug de Python.


Toute probabilité supérieure à 0 est à prendre en considération !-)

Maintenant, quand tu ajoutes un print dans ton prorgamme, il se peux
que python modifie le type de ta variable implicitement


Non. *là*, ce serait un bug.

Avatar
Bruno Desthuilliers
Voici le code correspondant :
Sans le print ecrirefich à la fin, ca coince !
Je n'ai pas d'idée
Merci
Francois

ps : mis sitecustomize.py latin-1.
En entete du programme, Cp1252,latin11,cp850,utf-8 ca ne résoud rien.



Il se peut que le problème soit dans l'encodage du fichier source...


fichiermots=open('mots_francais.txt','r') #fichier initial
dest=open('dicosort.txt','w') #fichier retraité
DICO={'-':'','ä':'a','é':'e','è':'e','ê':'e','ë':'e','à':'a','â':'a','ç':'c','î':'i','ï':'i','ü':'u','ù':'u','û':'u','ö':'o','ô':'o'}

Le
while L<123:
DICO[chr(L)]=chr(L)
L=L+1


regarde du côté de string.translate() pour ce genre de traitements...

Sinon, en Python, la convention veut qu'un identifiant en MAJUSCULES
soit considéré comme une CONSTANTE.

while 1:
motliste=[]
motrie2=''
x=0
a=fichiermots.readline()
if len(a)==0: #tester si EOF
break
else:


Pour parcourir un fichier ligne par ligne, c'est *beaucoup* plus simple
que ça:

for line in fichiermots:
# do something with line

for car in a[:len(a)-1]:
pourrait (devrait) s'écrire: for car in a[:-1]:...


mais attention, si le but est de supprimer un saut de ligne, il vaut
mieux utiliser a.strip()

s=DICO[car] #remplacement accentuation par normal
motliste.append(s) #constitution du mot


ces trois ligne pourraient s'écrire:
motliste = [DICO[car] for car in a.strip()]

motliste.sort()
for let in motliste:
motrie2=motrie2+motliste[x].lower()
x=x+1
Pourquoi utiliser un compteur (x) et un accès par index, alors que tu a

déjà le caractère sous la main ?
for car in motliste:
motrie2 += car.lower()

Ceci étant, ce n'est pas la bonne façon de faire en Python. Utilise
join() à la place. De même, appeler lower() sur chaque caractère est une
perte de temps quand tu peux le faire sur toute la chaine d'un coup:
motrie2 = "".join(motliste)
motrie2 = motrie2.lower()

ecrirefich = ""%s";"%s"n" % (a[:len(a)-1],motrie2)


ecrirefich = '"%s";"%s"n' % (a.strip(), motrie2)

print ecrirefich
dest.write(ecrirefich)

fichiermots.close()
dest.close()



Je ne pense pas que ça règle ton problème (que je n'ai pas réussi à
reproduire ici, mais on n'a pas non plus ton fichier de mots...), mais
si ça peut t'aider:

import string

FROM = 'àâäçéèëêïîôöùûü'
TO = 'aaaceeeeiioouuu'
TBL = string.maketrans(FROM, TO)
DEL = '-'
FORMAT = '"%s";"%s"n'

src = open('mots_francais.txt','r')
dest = open('dicosort.txt','w')

for line in src:
word = line.strip()
sorted_word = "".join(sorted(word.translate(TBL, DEL).lower()))
out = FORMAT % (word, sorted_word)
dest.write(out)

src.close()
dest.close()

NB: pas testé, mais sauf typo, ça devrait tourner...

Avatar
Almaleh
MERCI !!
Francois


Je ne pense pas que ça règle ton problème (que je n'ai pas réussi à
reproduire ici, mais on n'a pas non plus ton fichier de mots...), mais si ça
peut t'aider:

import string

FROM = 'àâäçéèëêïîôöùûü'
TO = 'aaaceeeeiioouuu'
TBL = string.maketrans(FROM, TO)
DEL = '-'
FORMAT = '"%s";"%s"n'

src = open('mots_francais.txt','r')
dest = open('dicosort.txt','w')

for line in src:
word = line.strip()
sorted_word = "".join(sorted(word.translate(TBL, DEL).lower()))
out = FORMAT % (word, sorted_word)
dest.write(out)

src.close()
dest.close()

NB: pas testé, mais sauf typo, ça devrait tourner...



--
Francois A.
_________

Excellent newsreader : http://mesnews.no-ip.com

1 2