我一直在试图导出一个大型熊猫数据框使用DataFrame.to_sql
到MySQL数据库,但数据框在一些列中有unicode字符,其中一些在导出时会导致警告,并被转换为?
。熊猫DataFrame到MySQL导出Unicode字符
我设法重现该问题与此示例(数据库登录删除):
import pandas as pd
import sqlalchemy
import pymysql
engine = sqlalchemy.create_engine('mysql+pymysql://{}:{}@{}/{}?charset=utf8'.format(*login_info), encoding='utf-8')
df_test = pd.DataFrame([[u'\u010daj',2], \
['čaj',2], \
['špenát',4], \
['květák',7], \
['kuře',1]], \
columns = ['a','b'])
df_test.to_sql('test', engine, if_exists = 'replace', index = False, dtype={'a': sqlalchemy.types.UnicodeText()})
前两个数据框的行应该是一样的,只是有不同的定义。
我得到以下警告,并且有问题的字符(č
,ě
,ř
)都呈现为?
:
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:166: Warning: (1366, "Incorrect string value: '\\xC4\\x8Daj' for column 'a' at row 1")
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:166: Warning: (1366, "Incorrect string value: '\\xC4\\x8Daj' for column 'a' at row 2")
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:166: Warning: (1366, "Incorrect string value: '\\xC4\\x9Bt\\xC3\\xA1k' for column 'a' at row 4")
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:166: Warning: (1366, "Incorrect string value: '\\xC5\\x99e' for column 'a' at row 5")
result = self._query(query)
与所得到的数据库表test
看起来像这样:
a b
?aj 2
?aj 2
špenát 4
kv?ták 7
ku?e 1
奇怪的是,ž
,š
和á
字符(以及我的完整数据集中的其他字符)是过程sed正确,所以它似乎只影响unicode字符的一个子集。正如你在上面看到的,我也尽可能地设置了utf-8
(engine
,DataFrame.to_sql
),但没有效果。