Python sqlalchemy插入blob引发UnicodeDecodeError
正在尝试将工作的Python代码从Mac重用到Windows。代码使用gzip压缩utf8字符串,并使用SQLAlchemy将输出作为blob插入 但是,在插入之后,我得到以下错误: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
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)
);