OVH Cloud OVH Cloud

unicode

7 réponses
Avatar
R12y
Bonjour,
toujours dans le but de renomme des fichiers, je n'arrive pas à utiliser
la solution suivante:

##############################################
import os, os.path, string, sys
from unicodedata import decomposition

def remove_accent(car):
deco = decomposition(car)
if deco:
return chr(int(deco.split()[0],16))
else:
return car
s=u"Vous êtes extrêmement sympas de m'avoir dépanné"
print "".join([remove_accent(c) for c in s])
##############################################

J'ai :
##############################################
in remove_accent(car)
ValueError: invalid literal for int(): <super>
##############################################

Je n'arrive pas à interpréter ce message.
Pourriez-vous me donner un petit coup de main s'il vous plait?

Merci d'avance.

--
SPIP, phpNuke, Plone, opengroupware... c'est bien
CPS c'est mieux: http://www.cps-project.org/
Hébergement de sites CPS: http://www.objectis.org/

7 réponses

Avatar
Do Re Mi chel La Si Do
Bonsoir !

Le code donné fonctionne cher moi...
Sinon, l'emploi de "chr" me semble inapproprié ; je préfèrerais "unichr".

@-salutations
--
Michel Claveau
Avatar
Do Re Mi chel La Si Do
Re !


J'ai réussi à reproduire ton erreur.

Pour cela, j'ai dû enregistrer le script en UTF-8, en précisant,au début du
script :
# -*- coding: cp1252 -*-

Il y a donc, sans doute, un problème d'encodage, à l'enregistrement du
script.


Michel Claveau
Avatar
Amaury
Bonjour,
toujours dans le but de renomme des fichiers, je n'arrive pas à utiliser
la solution suivante:

##############################################
import os, os.path, string, sys
from unicodedata import decomposition

def remove_accent(car):
deco = decomposition(car)
if deco:
return chr(int(deco.split()[0],16))
else:
return car
s=u"Vous êtes extrêmement sympas de m'avoir dépanné"
print "".join([remove_accent(c) for c in s])
##############################################

J'ai :
##############################################
in remove_accent(car)
ValueError: invalid literal for int(): <super>
##############################################


Question habituelle dans ce cas: Quel est le "coding" utilisé par
python? ça peut changer la façon dont les caractères accentués sont
compris... Il manque une ligne -*- coding:xxx -*- pour en être sûr...

Ceci dit, je suis curieux de savoit quel est le caractère qui provoque
cette erreur, ce que donne la commande suivante:
[decomposition(c) for c in s]

--
Amaury

Avatar
R12y
On Tue, 04 Oct 2005 23:01:27 +0200, Do Re Mi chel La Si Do wrote:

Il y a donc, sans doute, un problème d'encodage, à l'enregistrement du
script.


Exactement.
Je viens de forcer l'enregistrement du fichier en iso-8859-15 et c'est
passé.

Par contre, dans la mesure ou j'ai déjà #!/usr/bin/python en première
ligne du script, ou puis-je placer cette ligne de coding?
(J'ai déjà posé la question sur le groupe Emacs, j'apporterais la réponse
une fois obtenue)

--
SPIP, phpNuke, Plone, opengroupware... c'est bien
CPS c'est mieux: http://www.cps-project.org/
Hébergement de sites CPS: http://www.objectis.org/

Avatar
R12y
Voici le code qui fait "tout" le cacher des charges:

Noter l'encodage-decodage unicode....

import os, os.path, string, sys
from unicodedata import decomposition

opj=os.path.join
sa=sys.argv

def remove_accent_char(car):
decoÞcomposition(car)
if deco:
return unichr(int(deco.split()[0],16))
else:
return car

def remove_accent_str(s):
return "".join([remove_accent_char(c) for c in unicode(s, 'latin-1')])
################################################### unicodage

# renommage des "feuilles" d'abord.
for (root, dirs, files) in os.walk(sa[1], topdownúlse):
for a_file in files:
old=opj(root, a_file)
new=str(remove_accent_str(opj(root, a_file.replace(sa[2],sa[3]))))
### desunicodage
print old + "->" + new
os.rename(old,new)
###################################

# renommage en remontant des répertoires
for (root, dirs, files) in os.walk(sa[1], topdownúlse):
for a_dir in dirs:
old=opj(root, a_dir)
new=str(remove_accent_str(opj(root, a_dir.replace(sa[2],sa[3]))))
### desunicodage
print old + "->" + new
os.rename(old,new)
########################################

--
SPIP, phpNuke, Plone, opengroupware... c'est bien
CPS c'est mieux: http://www.cps-project.org/
Hébergement de sites CPS: http://www.objectis.org/
Avatar
Jonathan Barnoud
On Tue, 04 Oct 2005 23:01:27 +0200, Do Re Mi chel La Si Do wrote:


Il y a donc, sans doute, un problème d'encodage, à l'enregistrement du
script.



Exactement.
Je viens de forcer l'enregistrement du fichier en iso-8859-15 et c'est
passé.

Par contre, dans la mesure ou j'ai déjà #!/usr/bin/python en première
ligne du script, ou puis-je placer cette ligne de coding?
(J'ai déjà posé la question sur le groupe Emacs, j'apporterais la réponse
une fois obtenue)



Personellement je met la ligne de coding en deuxieme et ça marche impec.

Jonathan Barnoud


Avatar
marcoplaut
Le Wed, 05 Oct 2005 07:50:10 +0200, Jonathan Barnoud a écrit :

On Tue, 04 Oct 2005 23:01:27 +0200, Do Re Mi chel La Si Do wrote:


Il y a donc, sans doute, un problème d'encodage, à l'enregistrement du
script.



Exactement.
Je viens de forcer l'enregistrement du fichier en iso-8859-15 et c'est
passé.

Par contre, dans la mesure ou j'ai déjà #!/usr/bin/python en première
ligne du script, ou puis-je placer cette ligne de coding?
(J'ai déjà posé la question sur le groupe Emacs, j'apporterais la réponse
une fois obtenue)



Personellement je met la ligne de coding en deuxieme et ça marche impec.

Jonathan Barnoud



Bonjours chez moi j'ai le code suivant :


#!/usr/bin/python
# -*- coding: cp1252 -*-

import os, os.path, string, sys
from unicodedata import decomposition

opj=os.path.join
sa=sys.argv

def remove_accent_char(car):
decoÞcomposition(car)
if deco:
return unichr(int(deco.split()[0],16))
else:
return car

def remove_accent_str(s):
return "".join([remove_accent_char(c) for c in unicode(s, 'latin-1')])
################################################### unicodage

# renommage des "feuilles" d'abord.
for (root, dirs, files) in os.walk(sa[1], topdownúlse):
for a_file in files:
old=opj(root, a_file)
new=str(remove_accent_str(opj(root, a_file.replace(sa[2],sa[3]))))
### desunicodage
print old + "->" + new
os.rename(old,new)
###################################

# renommage en remontant des répertoires
for (root, dirs, files) in os.walk(sa[1], topdownúlse):
for a_dir in dirs:
old=opj(root, a_dir)
new=str(remove_accent_str(opj(root, a_dir.replace(sa[2],sa[3]))))
### desunicodage
print old + "->" + new
os.rename(old,new)
########################################


et j'ai cette erreur :

Traceback (most recent call last):
File "./scriptvireraccents.py", line 22, in ?
for (root, dirs, files) in os.walk(sa[1], topdownúlse):
IndexError: list index out of range

quelqu'un a-til une suggestion ?