使用pandas方法to_sql与MySQL时的另一个UnicodeEncodeError

时间:2015-10-30 18:07:07

标签: python mysql pandas

几天前我用similar problem(已经解决了)在堆栈溢出上发布了,我不确定这里的礼节是什么,但我发了一个新帖子

基本上,当我尝试将pandas DataFrame写入MySQL数据库时,我得到了一个UnicodeEncodeError。我可以使用以下代码重现错误:

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql://root:@localhost/testdb')
df = pd.DataFrame([[u'\u2013',2],['e',4]], index = ['a','b'], columns = ['c','d'])
df.to_sql('data', engine, if_exists = 'replace', index = False)

这是错误:

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 0: ordinal not in range(256)

这是追溯的最后一行:

C:\Anaconda\lib\site-packages\sqlalchemy\dialects\mysql\mysqldb.pyc in do_executemany(self, cursor, statement, parameters, context)
     93 
     94     def do_executemany(self, cursor, statement, parameters, context=None):
---> 95         rowcount = cursor.executemany(statement, parameters)
     96         if context is not None:
     97             context._rowcount = rowcount

之前我遇到此问题时,原因是pandas.io.sql中存在错误,修复方法是更改​​a few lines of code。这工作正常,直到我遇到latin-1编解码器范围之外的字符。

你们有什么建议吗?

2 个答案:

答案 0 :(得分:8)

好吧,在发布问题的一小时内,我已经弄明白了。也许在发布之前我应该​​做更多的研究。

问题是sqlalchemy需要配置为使用utf-8编码。上述代码中的解决方案是将第3行更改为:

engine = create_engine('mysql://root:@localhost/testdb?charset=utf8', encoding = 'utf-8')

答案 1 :(得分:0)

\u2013是一个“破折号”。也许有些文字处理程序正在创建它?也许您会对简单的-感到满意?

请参见https://docs.sqlalchemy.org/en/latest/dialects/mysql.html#mysql-unicode