2011-02-08 7 views
1

Je lis l'artiste d'une chanson à partir de son étiquette MP3, puis crée un dossier basé sur ce nom. Le problème que j'ai est quand le nom contient un caractère spécial comme 'AC \ DC'. J'ai donc écrit ce code pour y faire face.python: Remplacer des caractères spéciaux dans une chaîne

def replace_all(text): 
    print "replace_all" 
    dictionary = {'\\':"", '?':"", '/':"", '...':"", ':':"", chr(148):"o"} 

    for i, j in dictionary.iteritems(): 
     text = text.replace(i,j) 

    return text 

Ce que je suis en cours d'exécution en est maintenant la façon de traiter avec des caractères non anglais comme un umlaout o dans le culte Oyster Motorhead ou bleu.

Comme vous le voyez, j'ai essayé d'ajouter la version ascii-chaîne de umlaout o à la fin du dictionnaire, mais qui a échoué avec

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128) 
+1

http://farmdev.com/talks/unicode/ –

+0

Voir aussi http://stackoverflow.com/questions/3833791/python-regex-to-convert-non-ascii-characters-in-a-string- au-proche-ascii-équivalent pour la discussion d'une solution plus générale. – Mikel

+0

@Ignacio C'est un super lien! Cela a beaucoup aidé. – ccwhite1

Répondre

3

J'ai trouvé ce code, même si je ne le comprends pas.

def strip_accents(s): 
    return ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn')) 

Il m'a permis de supprimer les marques d'accentuation du chemin des répertoires/noms de fichiers proposés.

+0

ni je le comprends - excellent morceau de pythoness –

0

Je suggère d'utiliser unicode pour le texte d'entrée et les caractères remplacés. Dans votre exemple, chr(148) n'est clairement pas un symbole Unicode.

+0

Alors, comment puis-je prendre une chaîne qui a un caractère unicode à l'intérieur et forcer l'ensemble de la chaîne à unicode? Et est-ce que cela change alors en caractères non-unicode de la chaîne? – ccwhite1

+0

Vous avez probablement une chaîne simple (octet/chaîne binaire) dans un codage spécifique, tel que ISO-8859-1 ou UTF-8. Vous devez décoder de ce codage le type de données Unicode de Python, comme ceci: 'utext = text.decode ('utf-8')'. –

Questions connexes