mp3tag - python que codifica utf-8
mp3 tag linux (2)
Desafortunadamente, el método string.encode () no siempre es confiable. Echa un vistazo a este hilo para más información: ¿Cuál es la forma infalible de convertir una cadena (utf-8 o más) en una cadena ASCII simple en python
Estoy haciendo algunos guiones en Python. Creo una cadena que guardo en un archivo. Esta cadena recibió muchos datos, provenientes de la arborescencia y nombres de archivo de un directorio. Según convmv, toda mi arborescencia está en UTF-8.
Quiero mantener todo en UTF-8 porque luego lo guardaré en MySQL. Por ahora, en MySQL, que está en UTF-8, tuve algunos problemas con algunos personajes (como é o è - soy francés).
Quiero que Python siempre use cadena como UTF-8. Leí algunas informaciones en Internet y me gustó esto.
Mi script comienza con esto:
#!/usr/bin/python
# -*- coding: utf-8 -*-
def createIndex():
import codecs
toUtf8=codecs.getencoder(''UTF8'')
#lot of operations & building indexSTR the string who matter
findex=open(''config/index/music_vibration_''+date+''.index'',''a'')
findex.write(codecs.BOM_UTF8)
findex.write(toUtf8(indexSTR)) #this bugs!
Y cuando ejecuto, aquí está la respuesta: UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xc3 in position 2171: ordinal not in range(128)
Editar: Veo, en mi archivo, el acento está muy bien escrito. Después de crear este archivo, lo leí y lo escribí en MySQL. Pero no entiendo por qué, pero tengo un problema con la codificación. Mi base de datos MySQL está en utf8, o parece ser una consulta SQL SHOW variables LIKE ''char%''
me devuelve solo utf8 o binario.
Mi función se ve así:
#!/usr/bin/python
# -*- coding: utf-8 -*-
def saveIndex(index,date):
import MySQLdb as mdb
import codecs
sql = mdb.connect(''localhost'',''admin'',''*******'',''music_vibration'')
sql.charset="utf8"
findex=open(''config/index/''+index,''r'')
lines=findex.readlines()
for line in lines:
if line.find(''#artiste'') != -1:
artiste=line.split(''[:::]'')
artiste=artiste[1].replace(''/n'','''')
c=sql.cursor()
c.execute(''SELECT COUNT(id) AS nbr FROM artistes WHERE nom="''+artiste+''"'')
nbr=c.fetchone()
if nbr[0]==0:
c=sql.cursor()
iArt+=1
c.execute(''INSERT INTO artistes(nom,status,path) VALUES("''+artiste+''",99,"''+artiste+''/")''.encode(''utf8'')
Y el artista que se muestra agradablemente en el archivo escribe mal en el BDD. Cuál es el problema ?
No necesita codificar datos que ya están codificados. Cuando trates de hacer eso, Python primero intentará decodificarlo a unicode
antes de que pueda codificarlo de nuevo a UTF-8. Eso es lo que está fallando aquí:
>>> data = u''/u00c3'' # Unicode data
>>> data = data.encode(''utf8'') # encoded to UTF-8
>>> data
''/xc3/x83''
>>> data.encode(''utf8'') # Try to *re*-encode it
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xc3 in position 0: ordinal not in range(128)
Simplemente escriba sus datos directamente en el archivo, no es necesario codificar los datos ya codificados.
Si, en cambio, crea valores unicode
lugar, de hecho deberá codificarlos para que se puedan escribir en un archivo. En su lugar, querrá usar codecs.open()
, que devuelve un objeto de archivo que codificará los valores Unicode para UTF-8 por usted.
También realmente no desea escribir la lista de materiales UTF-8, a menos que tenga que admitir herramientas de Microsoft que no pueden leer UTF-8 de lo contrario (como MS Notepad).
Para su problema de inserción de MySQL, debe hacer dos cosas:
Agregue
charset=''utf8''
a su llamadaMySQLdb.connect()
.Utilice objetos
unicode
, no objetosstr
cuando consulta o inserta, pero use parámetros sql para que el conector MySQL pueda hacer lo correcto para usted:artiste = artiste.decode(''utf8'') # it is already UTF8, decode to unicode c.execute(''SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s'', (artiste,)) # ... c.execute(''INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)'', (artiste, artiste + u''/''))
En realidad, puede funcionar mejor si usó codecs.open()
para decodificar los contenidos automáticamente en su lugar:
import codecs
sql = mdb.connect(''localhost'',''admin'',''ugo&(-@F'',''music_vibration'', charset=''utf8'')
with codecs.open(''config/index/''+index, ''r'', ''utf8'') as findex:
for line in findex:
if u''#artiste'' not in line:
continue
artiste=line.split(u''[:::]'')[1].strip()
cursor = sql.cursor()
cursor.execute(''SELECT COUNT(id) AS nbr FROM artistes WHERE nom=%s'', (artiste,))
if not cursor.fetchone()[0]:
cursor = sql.cursor()
cursor.execute(''INSERT INTO artistes(nom,status,path) VALUES(%s, 99, %s)'', (artiste, artiste + u''/''))
artists_inserted += 1
Es posible que desee repasar Unicode y UTF-8 y codificaciones. Puedo recomendar los siguientes artículos: