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.
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
provare 'print repr (cell)' che sarà più utile (specialmente quando si blocca) –
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