2014-10-29 20 views
6

Sto usando Python 2.7 e MySQLdb 1.2.3. Ho provato tutto quello che ho trovato su StackOverflow e altri forum per gestire gli errori di codifica che il mio script sta generando. Il mio script legge i dati da tutte le tabelle in un DB MySQL di origine, li scrive in un oggetto python StringIO.StringIO e carica tali dati dall'oggetto StringIO al database Postgres (che apparentemente è in formato di codifica UTF-8. Proprietà - Definizione del database in pgadmin) utilizzando il comando copy_from della libreria psycopg2.UnicodeEncodeError: il codec 'ascii' non può codificare il carattere u ' u2019' nella posizione 47: ordinale non compreso nell'intervallo (128)

Ho scoperto che il mio database MySQL di origine ha alcune tabelle nella codifica latin1_swedish_ci, mentre altre nel formato di codifica utf_8 (Trovato da TABLE_COLLATION in information_schema.tables).

Ho scritto tutto questo codice sulla parte superiore del mio script Python basato sulla mia ricerca su 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;') 

ho ancora ottenere il UnicodeEncodeError di seguito con questa linea: 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) 

ho scritto la seguente riga di codice per pulire le cellule in ogni tabella del database MySQL di origine durante la scrittura oggetto StringIO.

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

Si prega di aiutare.

risposta

10

str(cell) sta tentando di convertire cell in ASCII. ASCII supporta solo caratteri con ordinali inferiori a 255. Che cos'è la cella?

Se cell è una stringa Unicode, basta fare cell.encode("utf8"), e che restituirà un bytestring codificato come UTF 8

... o realmente IIRC. Se si passa mysql unicode, quindi il database verrà automagicamente convertirlo in utf8 ...

Si potrebbe anche provare,

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

o semplicemente utilizzare una libreria 3rd party. Ce n'è una buona che correggerà il testo per te.

+0

Quindi, cella è il valore della colonna per una riga in una tabella (dal DB MySQL di origine in cui ho imposto la lettura UTF-8 in tutti i modi, come si può vedere sopra). cella può contenere qualsiasi cosa da 1, 50, 100, "Robert", "Questa è una frase" ecc. – user3422637

+0

provare 'print repr (cell)' che sarà più utile (specialmente quando si blocca) –

+0

Ho appena provato quello prima e dopo lo str() accade. Ho qualcosa di simile: Per due delle occorrenze di cellule Prima str(): 2L Dopo str(): '2' Prima str(): u'Jog' Dopo str(): 'Jog' Il programma non si arresta in modo anomalo per questi valori della cella btw. Non posso scrivere qui il testo nella cella ma posso dirti che è una frase lunga e ha un apostrofo '' ' – user3422637

Problemi correlati