【问题标题】:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 47: ordinal not in range(128)UnicodeEncodeError:'ascii' 编解码器无法在位置 47 编码字符 u'\u2019':序数不在范围内(128)
【发布时间】:2014-12-25 18:54:06
【问题描述】:

我正在使用 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;')

我仍然得到下面这行的UnicodeEncodeErrorcell = 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

请帮忙。

【问题讨论】:

    标签: python mysql postgresql encoding


    【解决方案1】:

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

    或者只使用第 3 方库。有一个可以为您修复文本的好方法。

    【讨论】:

    • 因此,单元格是表中一行的列值(来自我已强制执行 UTF-8 读取的源 MySQL DB,如上所示)。单元格可以容纳 1、50、100、“罗伯特”、“这是一个句子”等任何内容
    • 试试print repr(cell) 会更有帮助(尤其是当它崩溃时)
    • 我只是在 str() 发生之前和之后尝试过。我得到了这样的东西:对于两个单元格出现在 str() 之前:2L 在 str() 之后:'2' 在 str() 之前:u'Jog' 在 str() 之后:'Jog' 程序不会崩溃顺便说一句,这些单元格的值。我不能在这里写单元格中的文本,但我可以告诉你这是一个很长的句子,里面有一个撇号'''
    • 试试这个isinstance(cell.encode("utf8"),str) ...但unicode也有替换...我不明白你为什么在cell对象上调用str
    • 非常感谢您一直以来的帮助。所以,我最终发现,我需要以 str 格式写入数据,因为我将它写入 StringIO 对象(然后使用 copy_from 将数据复制到 Postgres)。但是,我必须处理 str() 函数无法处理的所有 unicode 字符,例如 u'u\2018'、u'\xc9' 等。因此,我导入了 unicode python 包并使用 unicode() 函数将所有这些 un​​icode 字符转换为关闭的 ASCII 字符。然后我做了一个 str() 。这解决了我的问题。谢谢。
    猜你喜欢
    • 2017-03-29
    • 2017-09-08
    • 2016-08-26
    • 2011-07-05
    • 2018-07-10
    • 2012-04-14
    • 2016-09-05
    • 2013-02-11
    • 2012-05-06
    相关资源
    最近更新 更多