Pandas: to_sql UnicodeEncodeError

Créé le 1 sept. 2015  ·  3Commentaires  ·  Source: pandas-dev/pandas

écrire une trame de données en SQL donne une erreur UnicodeEncodeError, même si sys.defaultencoding est défini sur "utf-8" et que la base de données mysql utilise également utf-8 comme classement par défaut. Des idées? Merci!

Dans [6] : df1.to_sql(name='webshoptracks2', con=engine)

UnicodeEncodeError Traceback (appel le plus récent en dernier)
dans()
----> 1 df1.to_sql(name='webshoptracks2', con=engine)

C:\Python27\lib\site-packages\pandas\core\generic.pyc dans to_sql(self, name, con,
saveur, schéma, if_exists, index, index_label, chunksize, dtype)
980 soi, nom, con, saveur=saveur, schéma=schéma, if_exists=if_
existe,
981 index=index, index_label=index_label, chunksize=chunksize,
--> 982 dtype=dtype)
983
984 def to_pickle(self, path):

C:\Python27\lib\site-packages\pandas\io\sql.pyc dans to_sql(frame, name, con, flav
ou, schema, if_exists, index, index_label, chunksize, dtype)
547 pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index,
548 index_label=index_label, schema=schema,
--> 549 taille de bloc=taille de bloc, type de type=type de type)
550
551

C:\Python27\lib\site-packages\pandas\io\sql.pyc dans to_sql(self, frame, name, if_
existe, index, index_label, schema, chunksize, dtype)
1186 schéma=schéma, dtype=dtype)
1187 table.create()
-> 1188 table.insert (taille de bloc)
1189 # vérifier les problèmes potentiels de sensibilité à la casse (GH7815)
1190 si le nom n'est pas dans self.engine.table_names(schema=schema ou self.met
a.schéma):

C:\Python27\lib\site-packages\pandas\io\sql.pyc dans insert(self, chunksize)
726
727 chunk_iter = zip(*[arr[start_i:end_i] pour arr dans data_li
st])
--> 728 self._execute_insert(conn, keys, chunk_iter)
729
730 def _query_iterator(self, result, chunksize, colonnes, coerce_float=T
rue,

C:\Python27\lib\site-packages\pandas\io\sql.pyc dans _execute_insert(self, conn, k
eys, data_iter)
701 def _execute_insert(self, conn, keys, data_iter):
702 data = [dict((k, v) for k, v in zip(keys, row)) for row in data_
iter]
--> 703 conn.execute(self.insert_statement(), données)
704
705 def insert(self, chunksize=None):

C:\Python27\lib\site-packages\sqlalchemy\engine\base.pyc dans execute(self, object
, _multiparams, *_params)
912 type (objet))
913 sinon :
--> 914 return meth(self, multiparams, params)
915
916 def _execute_function(self, func, multiparams, params):

C:\Python27\lib\site-packages\sqlalchemy\sql\elements.pyc dans _execute_on_connect
ion(self, connection, multiparams, params)
321
322 def _execute_on_connection(self, connection, multiparams, params):
--> 323 return connection._execute_clauseelement(self, multiparams, para
Mme)
324
325 def unique_params(self, _optionaldict, *_kwargs) :

C:\Python27\lib\site-packages\sqlalchemy\engine\base.pyc dans _execute_clauseeleme
nt(self, elem, multiparams, params)
1008 compilé_sql,
1009 distilled_params,
-> 1010 compiled_sql, distilled_params
1011)
1012 si self._has_events ou self.engine._has_events :

C:\Python27\lib\site-packages\sqlalchemy\engine\base.pyc dans _execute_context(sel
f, dialecte, constructeur, instruction, paramètres, *args)
1144 paramètres,
curseur 1145,
-> 1146 contexte)
1147
1148 si self._has_events ou self.engine._has_events :

C:\Python27\lib\site-packages\sqlalchemy\engine\base.pyc dans _handle_dbapi_except
ion(self, e, instruction, paramètres, curseur, contexte)
1342 )
1343 sinon :
-> 1344 util.reraise(*exc_info)
1345
1346 enfin :

C:\Python27\lib\site-packages\sqlalchemy\engine\base.pyc dans _execute_context(sel
f, dialecte, constructeur, instruction, paramètres, *args)
1114 déclaration,
1115 paramètres,
-> 1116 contexte)
1117 paramètres elif pas et context.no_parameters :
1118 si self.dialect._has_events :

C:\Python27\lib\site-packages\sqlalchemy\dialects\mysql\mysqldb.pyc dans do_execut
emany(self, curseur, instruction, paramètres, contexte)
93
94 def do_executemany(self, curseur, instruction, parameters, context=None
):
---> 95 rowcount = cursor.executemany (instruction, paramètres)
96 si le contexte n'est pas Aucun :
97 context._rowcount = nombre de lignes

C:\Python27\lib\site-packages\pymysql\cursors.pyc dans executemany(self, query, ar
gs)
153 return self._do_execute_many(q_prefix, q_values, q_postfix,
arguments,
154 self.max_stmt_length,
--> 155 self._get_db().encoding)
156
157 self.rowcount = sum(self.execute(query, arg) pour arg dans args)

C:\Python27\lib\site-packages\pymysql\cursors.pyc dans _do_execute_many(self, pref
ix, valeurs, suffixe, arguments, max_stmt_length, encodage)
179 if isinstance(v, text_type):
180 si PY2 :
--> 181 v = v.encode(encodage)
182 autre :
183 v = v.encode(encodage, 'surrogateescape')

UnicodeEncodeError : le codec 'latin-1' ne peut pas encoder les caractères en position 433-438 :
ordinal non compris dans la plage (256)

IO SQL

Commentaire le plus utile

Merci! L'ajout de '?charset=utf8' à l'appel create_engine() a résolu le problème.

Tous les 3 commentaires

Avez-vous également essayé de configurer l'objet engine ? Voir http://docs.sqlalchemy.org/en/rel_1_0/core/engines.html#engine -creation-api

Et pouvez-vous fournir un exemple reproductible ? (un petit dataframe qui vous donne cette erreur)

Merci! L'ajout de '?charset=utf8' à l'appel create_engine() a résolu le problème.

Cette page vous a été utile?
0 / 5 - 0 notes