微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – UnicodeDecodeError:’ascii’编解码器无法解码位置47的字节0x92:序号不在范围内(128)

我试图使用Python在StringIO对象中写入数据,然后最终使用psycopg2的copy_from()函数将这些数据加载到postgres数据库中.

首先,当我这样做时,copy_from()抛出一个错误:ERROR:编码“UTF8”的无效字节序列:0xc92所以我遵循了this question.

我发现我的Postgres数据库有UTF8编码.

我正在编写数据的文件/ StringIO对象显示其编码如下:
setgid非ISO扩展ASCII英文文本,带有很长的行,带有CRLF行终止符

我试图将我写入中间文件/ StringIO对象的每个字符串编码为UTF8格式.要做到这一点,每个字符串使用.encode(encoding =’UTF-8′,errors =’strict’)).

这是我现在得到的错误
UnicodeDecodeError:’ascii’编解码器无法解码位置47的字节0x92:序号不在范围内(128)

这是什么意思?我如何解决它?

编辑:
我使用的是Python 2.7
我的一些代码

我从MysqL数据库中读取了根据MysqL Workbench以UTF-8编码的数据.
这是用于将我的数据(从MysqL db获得)写入StringIO对象的几行代码

# Populate the table_data variable with rows delimited by \n and columns delimited by \t
row_num=0
for row in cursor.fetchall() :

    # Separate rows in a table by new line delimiter
    if(row_num!=0):
        table_data.write("\n")

    col_num=0
    for cell in row:    
        # Separate cells in a row by tab delimiter
        if(col_num!=0):
            table_data.write("\t") 

        table_data.write(cell.encode(encoding='UTF-8',errors='strict'))
        col_num = col_num+1

    row_num = row_num+1   

这是从我的StringIO对象table_data写入Postgres数据库代码

cursor = db_connection.cursor()
cursor.copy_from(table_data, <postgres_table_name>)

解决方法:

问题是你在str对象上调用encode.

str是一个字节字符串,通常表示以某种方式编码的文本,如UTF-8.当您对其进行编码时,首先必须将其解码回文本,以便可以重新编码文本.认情况下,Python通过调用s.decode(sys.getgetdefaultencoding())来执行此操作,getdefaultencoding()通常返回’ascii’.

所以,你说的是UTF-8编码的文本,将其解码为ASCII,然后以UTF-8重新编码.

一般的解决方案是使用正确的编码显式调用decode,而不是让Python使用认值,然后对结果进行编码.

但是当正确的编码已经是你想要的那个时,更简单的解决方案就是跳过.decode(‘utf-8’).encode(‘utf-8’)并只使用UTF-8 str作为UTF-已经是8 str了.

或者,如果您的MysqL包装器具有允许您指定编码并返回CHAR / VARCHAR / TEXT列的unicode值而不是str值的功能(例如,在MysqLdb中,您将use_unicode = True传递给connect调用,或者charset =’UTF-8′,如果您的数据库太旧而无法自动检测它),就这样做.然后你将拥有unicode对象,你可以在它们上面调用.encode(‘utf-8’).

一般来说,处理Unicode问题的最佳方法是最后一个 – 尽可能早地解码所有内容,以Unicode进行所有处理,然后尽可能晚地进行编码.但不管怎样,你必须保持一致.不要在可能是unicode的东西上调用str;不要将str文字连接到unicode或将其传递给其replace方法;每当你混合搭配时,Python就会使用你的认编码为你隐式转换,这几乎不是你想要的.

作为旁注,这是Python 3.x的Unicode更改帮助的许多内容之一.首先,str现在是Unicode文本,而不是编码字节.更重要的是,如果你有编码字节,例如在一个字节对象中,调用encode会给你一个AttributeError而不是尝试静解码,所以它可以重新编码.而且,类似地,尝试混合和匹配Unicode和字节会给你一个明显的TypeError,而不是在某些情况下成功的隐式转换,并给出一个关于你没有在其他情况下要求的编码或解码的神秘消息.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐