我正在使用Python 2.7和MySQLdb 1.2.3。我尝试了在stackoverflow和其他论坛上找到的所有内容来处理我的脚本抛出的编码错误。
我的脚本从源MySQL DB中的所有表读取数据,将它们写入python StringIO.StringIO
对象,然后将该数据从StringIO
对象加载到Postgres数据库(显然是UTF-8编码格式)我通过使用psycopg2库的copy_from命令查看属性 - pgadmin中数据库的定义来找到这个。
我发现我的源MySQL数据库在latin1_swedish_ci编码中有一些表,而其他表用utf_8编码格式(在information_schema.tables中从TABLE_COLLATION找到)。
根据我在互联网上的研究,我在Python脚本的顶部编写了所有这些代码。
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;')
我仍然在下面的UnicodeEncodeError
获得此行: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)
在写入StringIO对象时,我编写了以下代码行来清理源MySQL数据库的每个表中的单元格。
cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value
请帮忙。
答案 0 :(得分:10)
str(cell)
正在尝试将cell
转换为ASCII。 ASCII仅支持序数小于255的字符。什么是单元格?
如果cell
是一个unicode字符串,只需执行cell.encode("utf8")
,这将返回编码为utf 8的字节字符串
......或者真的是iirc。如果你传递mysql unicode,那么数据库会自动将它转换为utf8 ...
您也可以尝试,
cell = unicode(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "")
或只使用第三方库。有一个很好的将为您修复文本。