Intenta interpretar el código de forma correcta previamente a aplicarlo a tu trabajo y si tquieres aportar algo puedes dejarlo en la sección de comentarios.
Solución:
Unidecode es la respuesta correcta para esto. Translitera cualquier Unicode string en la representación más cercana posible en texto ascii.
Ejemplo:
accented_string = u'Málaga'
# accented_string is of type 'unicode'
import unidecode
unaccented_string = unidecode.unidecode(accented_string)
# unaccented_string contains 'Malaga'and is of type 'str'
Qué tal esto:
import unicodedata
def strip_accents(s):
return ''.join(c for c in unicodedata.normalize('NFD', s)
if unicodedata.category(c) != 'Mn')
Esto también funciona con letras griegas:
>>> strip_accents(u"A u00c0 u0394 u038E")
u'A A u0394 u03a5'
>>>
La categoría de caracteres “Mn” significa Nonspacing_Mark
que es similar a unicodedata.combining en la respuesta de MiniQuark (no pensé en unicodedata.combining, pero probablemente sea la mejor solución, porque es más explícito).
Y tenga en cuenta que estas manipulaciones pueden alterar significativamente el significado del texto. Los acentos, diéresis, etc. no son “decoración”.
Acabo de encontrar esta respuesta en la Web:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
only_ascii = nfkd_form.encode('ASCII', 'ignore')
return only_ascii
Funciona bien (para francés, por ejemplo), pero creo que el segundo paso (eliminar los acentos) podría manejarse mejor que eliminar los caracteres que no son ASCII, porque esto fallará en algunos idiomas (griego, por ejemplo). La mejor solución probablemente sería eliminar explícitamente los caracteres Unicode que están etiquetados como signos diacríticos.
Editar: esto hace el truco:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
unicodedata.combining(c)
regresará true si el personaje c
se puede combinar con el carácter anterior, principalmente si es un diacrítico.
Editar 2: remove_accents
espera un unicode stringni un byte string. Si tienes un byte stringentonces debes decodificarlo en un código Unicode string como esto:
encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
byte_string = b"café" # or simply "café" before python 3.
unicode_string = byte_string.decode(encoding)