UnicodeEncodeError:' ascii'编解码器不能编码字符u' \ u2019'位置47:序数不在范围内(128)

时间:2014-10-29 21:31:59

标签: 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;')

我仍然在下面的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

请帮忙。

1 个答案:

答案 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("\"", "")

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