[Résolu]Signe non reconnu dans une boucle

Signe non reconnu dans une boucle [Résolu] - Python - Programmation

Marsh Posté le 15-08-2006 à 22:00:09    

bonjour,
 
je cherche à exclure certains éléments d'une variable grace à une boucle et une liste pour
crée une nouvelle variable sans ces éléments

Code :
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. v = 'la variable contient \ ² /  *  ?  "  < > | '
  4. liste = ['²','/','\\',':','*','?','"','<','>',"|"]
  5. test = ''
  6. for e in v :
  7. if e not in liste :
  8.  test = test + e
  9. print test
  10. if '²' in liste :
  11. print '² est dans la liste'
  12. if '²' in v :
  13. print '² est dans la variable'


résultat :
 
la variable contient  ²            
² est dans la liste
² est dans la variable
 
L'élément '²' est bien reconnu dans la variable ainsi que dans la liste.
Pourquoi pas dans la boucle ?


Message édité par magicdvil le 23-08-2006 à 22:47:58
Reply

Marsh Posté le 15-08-2006 à 22:00:09   

Reply

Marsh Posté le 15-08-2006 à 22:58:13    

et si tu remplaçais '\' par '\\'?
 
(accessoirement, c'est assez pourri comme méthode [:pingouino])

Reply

Marsh Posté le 15-08-2006 à 23:06:31    

Ce n'est pas le '\' mais bien le '²' qui me pose problème.
Dans le résultat 'la variable contient  ²' le '\' a bien été exclut.

Message cité 1 fois
Message édité par magicdvil le 15-08-2006 à 23:07:05
Reply

Marsh Posté le 15-08-2006 à 23:10:46    

magicdvil a écrit :

Ce n'est pas le '\' mais bien le '²' qui me pose problème.
Dans le résultat 'la variable contient  ²' le '\' a bien été exclut.


T'es gentil jeanlouis, mais '\' c'est un caractère d'échappement dans les strings Python (et dans les strings de la majorité des langages accessoirement), donc tu fais ce que je te demande et après on voit pour le reste [:pingouino]

Reply

Marsh Posté le 15-08-2006 à 23:25:40    

Mais bien sûr Ben-Hur que je suis gentil , pour ton information, dans la variable il y a un espace entre chaque caractères après le 'contient' d'où le '\' n'est pas un caractère d'échappement mais bien un caractère à par entière


Message édité par magicdvil le 16-08-2006 à 06:40:34
Reply

Marsh Posté le 18-08-2006 à 16:52:57    

Personne d'autre pour me donner un coup de pouce ?

Reply

Marsh Posté le 23-08-2006 à 17:30:50    

Euh, tu a mis la déclaration d'encodage UTF-8 dans ton fichier, est tu sur et certain à 100% que ton fichier soit au format UTF-8 ?
 
Si oui, cherche pas plus loin, converti toutes tes chaines de charactère en unicode et teste à nouveau ( remplace les '...' par u'...' )

Reply

Marsh Posté le 23-08-2006 à 21:46:17    

bonjour,
j'ai remplacé la variable "liste" par ceci : [u'²',u'/',u'\\',u':',u'*',u'?',u'"',u'<',u'>',u"|"]
 
resultat : UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)


Message édité par magicdvil le 23-08-2006 à 21:46:40
Reply

Marsh Posté le 23-08-2006 à 22:42:12    

Remplace toutes les chaînes de la même façon. Tout unicode ou rien unicode :) Fait le aussi pour v et pour les 2 lignes if '²' in
 
Pas besoin pour les print

Reply

Marsh Posté le 23-08-2006 à 22:47:00    

Merci Kristoph pour cette aide efficace, problème résolu.

Reply

Marsh Posté le 23-08-2006 à 22:47:00   

Reply

Marsh Posté le 23-08-2006 à 22:52:09    

Au fait, as tu compris pourquoi tu avais ton erreur dans la première version ? ;)

Reply

Marsh Posté le 24-08-2006 à 07:12:59    

Malheureusement non, et je cherche aussi une commande ou un moyen de transformer la variable "v" en unicode

Reply

Marsh Posté le 24-08-2006 à 09:45:58    

Bah en fait, ton fichier code source est en UTF-8. Ceci veux dire que tous les charactères non ASCII ( ASCII le vrai, celui avec comme numero de symbole < 128 ) sont codés sur 2 octets au moins. Quand tu fais alors for e in v: au moment de passer sur le ², tu vas en fait faire 2 iterations ( au moins ), une pour le charactère d'échapement UTF-8, l'autre pour le charactère qui va représenter ². Malheureusement, aucun de ces 2 charactères ne va passer le test de if e in liste:, seule la concaténation de ces 2 charactères le peut.
 
Et pour convertir une chaine de charactère en unicode, c'est très facile. Si la chaine est en utf-8, tu fait chaine.decode('utf-8'), si elle est en latin1 tu fais chaine.decode('latin1') et si elle est en vrai ASCII, il suffit de faire unicode(chaine) ou chaine.decode('ascii')


Message édité par Kristoph le 24-08-2006 à 09:59:41
Reply

Marsh Posté le 24-08-2006 à 09:53:35    

Merci pour tout, je suis au boulot actuellement, je teste cela se soir.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed