Unicode编码错误:在位置47无法使用'ascii'编码将字符u'\u2019'编码为整数,该字符不在128的范围内。

6
我正在使用Python 2.7和MySQLdb 1.2.3。我尝试了stackoverflow和其他论坛上找到的所有内容来处理脚本抛出的编码错误。
我的脚本从源MySQL数据库中读取数据,将其写入Python的StringIO.StringIO对象,然后使用psycopg2库的copy_from命令从StringIO对象加载数据到Postgres数据库(显然是以UTF-8编码格式。我通过在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("\"", "") #从列值中删除不需要的字符

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 47: ordinal not in range(128)

我在将MySQL数据库中的所有表写入StringIO对象时,编写了以下代码以清除单元格。
cell = str(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "") #Remove unwanted characters from column value

请帮忙。

1个回答

11

str(cell)试图将cell转换为ASCII码。 ASCII码仅支持序号小于255的字符。那么,cell是什么?

如果cell是一个Unicode字符串,只需执行cell.encode("utf8"),它将返回一个以UTF-8编码的字节串。

...或者真的是我记错了。如果您向MySQL传递Unicode,则数据库将自动将其转换为UTF-8...

您还可以尝试以下方法:

cell = unicode(cell).replace("\r", " ").replace("\n", " ").replace("\t", '').replace("\"", "")

或者使用第三方库。有一个很好的库可以帮助您修复文本。


我之前尝试过在str()之前和之后进行操作。我得到了类似于这样的结果: 对于cell的两个出现: str()之前:2L str()之后:'2' str()之前:u'Jog' str()之后:'Jog' 顺便说一下,程序不会因为这些cell的值而崩溃。我不能在这里写出cell中的文本,但我可以告诉你它是一个很长的句子,并且其中有一个撇号 '’'。 - user3422637
我需要使用str()函数,以便可以使用.replace方法从文本中删除不需要的字符。我能否在Python中将str从ascii转换为utf-8? 无论如何,我都应该尝试以某种方式处理撇号,而不是将其转换为str,因为这样会失败。 - user3422637
1
尝试这个isinstance(cell.encode("utf8"),str)...但是Unicode也有replace方法...我不明白为什么你要在cell对象上调用str - Joran Beasley
当我尝试使用cell.replace("\r", " ")而不是str(cell).replace("\r", " ")时,它会抛出一个错误AttributeError: 'long'对象没有属性'replace'。 - user3422637
1
非常感谢您一直以来的帮助。所以,我最终发现需要将数据以str格式编写,因为我将其写入StringIO对象(然后使用copy_from将数据复制到Postgres)。 但是,我必须处理所有这些Unicode字符,例如u'u\2018'、u'\xc9'等,这些字符无法由str()函数处理。 因此,我导入了unicode python包并使用unicode()函数将所有这些Unicode字符转换为最接近的ASCII字符。然后我对其进行了str()操作。这解决了我的问题。谢谢。 - user3422637
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接