Python sqlalchemy插入blob引发UnicodeDecodeError

Python sqlalchemy插入blob引发UnicodeDecodeError,python,sqlalchemy,zlib,Python,Sqlalchemy,Zlib,正在尝试将工作的Python代码从Mac重用到Windows。代码使用gzip压缩utf8字符串,并使用SQLAlchemy将输出作为blob插入 但是,在插入之后,我得到以下错误: UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 15: character maps to <undefined> 跟踪。。。(尝试将blob解码为cp1252时失败) 问题在于.decode

正在尝试将工作的Python代码从Mac重用到Windows。代码使用gzip压缩utf8字符串,并使用SQLAlchemy将输出作为blob插入

但是,在插入之后,我得到以下错误:

        UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 15: character maps to <undefined>
跟踪。。。(尝试将blob解码为cp1252时失败)


问题在于
.decode('cp1252')
。Windows-1252代码页不使用所有字节(例如,字节
8f
未使用,无法解码)。您可以使用拉丁文1

response
实际上是Windows-1252文本吗?如果不是,那么将其解码就毫无意义


zlib.compress
接受一个bytestring参数,
response
是一个bytestring,您可以直接压缩它,而无需重新编码。

刚刚解决了这个问题。怎样将pymysql从大约0.6.0升级到0.6.3。
出了什么问题?pymysql驱动程序试图通过转换为unicode来转义二进制数据。字节\x08不使用UTF8或拉丁语1映射到unicode。这就是失败的原因。

感谢您的回复。我尝试了几种可能的编码(拉丁语1、cp1252、utf8、ascii),所有的组合在转换0x8f字节时都会产生相同的错误,同样的代码在Mac上也能工作。我试着使用拉丁语1和utf8 sql db,这似乎无关紧要。你能发布整个堆栈跟踪,这样我们就可以看到异常实际发生的地方吗?您还可以为整个
.decode().encode()
组合提供理由吗?我用跟踪编辑帖子,它在尝试插入blob时出现。它似乎试图将blob解析为unicode字符串,并假定二进制数据的编码错误。我正在使用sqlalchemy的最新版本。我将字符串编码为utf8以进行后续计算。您可以发布表格定义吗?
        from sqlalchemy import *
        import zlib

        pcaxis_table = Table('pcaxis_data', meta, autoload=True, autoload_with=engine)

        try:
            response = urllib2.urlretrieve(url_source)
        except Exception as e:
            print url_source
            raise e

        infile = response.read()
        px_file = infile.decode('cp1252').encode('utf-8')

        cmpstr = zlib.compress(px_file)


        #out = StringIO.StringIO()
        #with gzip.GzipFile(fileobj=out, mode="w") as f:
        #    f.write(px_file)

        ins = pcaxis_table.insert(values = {'TableSQL':tableSQL,
                                            'zip_file':cmpstr, #out.getvalue()
                                            })
        ins.execute()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Anaconda\Lib\site-packages\sqlalchemy\sql\base.py", line 386, in execute
    return e._execute_clauseelement(self, multiparams, params)
  File "C:\Anaconda\Lib\site-packages\sqlalchemy\engine\base.py", line 1758, in _execute_clauseelement
    return connection._execute_clauseelement(elem, multiparams, params)
  File "C:\Anaconda\Lib\site-packages\sqlalchemy\engine\base.py", line 826, in _execute_clauseelement
    compiled_sql, distilled_params
  File "C:\Anaconda\Lib\site-packages\sqlalchemy\engine\base.py", line 958, in _execute_context
    context)
  File "C:\Anaconda\Lib\site-packages\sqlalchemy\engine\base.py", line 1162, in _handle_dbapi_exception
    util.reraise(*exc_info)
  File "C:\Anaconda\Lib\site-packages\sqlalchemy\engine\base.py", line 951, in _execute_context
    context)
  File "C:\Anaconda\Lib\site-packages\sqlalchemy\engine\default.py", line 436, in do_execute
    cursor.execute(statement, parameters)
  File "C:\Anaconda\Lib\site-packages\pymysql\cursors.py", line 100, in execute
    query = query % escaped_args
  File "C:\Anaconda\lib\encodings\cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 6: character maps to <undefined>
create table pcaxis_data(
    id int NOT NULL AUTO_INCREMENT,
    TableSQL varchar(25),
    zip_file BLOB,
    inserttime TIMESTAMP,
    PRIMARY KEY (id)
);