UnicodeEncodeError:'ascii'编解码器无法对位置47中的字符u'\ u2019'进行编码:序数不在范围内(128)

use*_*637 6 python mysql postgresql encoding

我使用的是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;')
Run Code Online (Sandbox Code Playgroud)

我仍然得到了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)
Run Code Online (Sandbox Code Playgroud)

在写入StringIO对象时,我编写了以下代码行来清理源MySQL数据库的每个表中的单元格.

cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value
Run Code Online (Sandbox Code Playgroud)

请帮忙.

Jor*_*ley 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("\"", "")
Run Code Online (Sandbox Code Playgroud)

或者只是使用第三方库.有一个很好的将为您修复文本.