UnicodeEncodeError: el codec ‘ascii’ no puede codificar el carácter u ‘\ u2019’ en la posición 47: ordinal no está dentro del rango (128)

Estoy usando Python 2.7 y MySQLdb 1.2.3. Intenté todo lo que encontré en stackoverflow y otros foros para manejar los errores de encoding que está lanzando mi script. Mi script lee los datos de todas las tablas en una base de datos MySQL de origen, los escribe en un objeto StringIO.StringIO python y luego carga los datos del objeto StringIO a la base de datos Postgres (que aparentemente está en formato de encoding UTF-8. Lo encontré mirando en Propiedades – Definición de la base de datos en pgadmin) mediante el comando copy_from de la biblioteca psycopg2.

Descubrí que mi base de datos MySQL de origen tiene algunas tablas en encoding latin1_swedish_ci mientras que otras en formato de encoding utf_8 (esto se encuentra en TABLE_COLLATION en information_schema.tables).

Escribí todo este código en la parte superior de mi script de Python basado en mi investigación en Internet.

 db_conn = MySQLdb.connect(host=host,user=user,passwd=passwd,db=db, charset="utf8", init_command='SET NAMES UTF8' ,use_unicode=True) db_conn.set_character_set('utf8') db_conn_cursor = db_conn.cursor() db_conn_cursor.execute('SET NAMES utf8;') db_conn_cursor.execute('SET CHARACTER SET utf8;') db_conn_cursor.execute('SET character_set_connection=utf8;') 

Todavía tengo el UnicodeEncodeError debajo con esta línea: cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value ,

 UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 47: ordinal not in range(128) 

Escribí la siguiente línea de código para limpiar celdas en cada tabla de la base de datos MySQL de origen al escribir en el objeto StringIO.

 cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value 

Por favor ayuda.

str(cell) está intentando convertir una cell a ASCII. ASCII solo admite caracteres con ordinales menores de 255. ¿Qué es una celda?

Si cell es una cadena Unicode, simplemente cell.encode("utf8") , y eso devolverá una secuencia codificada como utf 8

… o realmente iirc. Si pasa unicode mysql, la base de datos lo convertirá automáticamente a utf8 …

También podrías intentarlo,

 cell = unicode(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") 

o simplemente usar una biblioteca de terceros. Hay una buena que arreglará el texto para ti.