UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0x80:无效的起始字节

时间:2018-10-02 14:48:18

标签: python utf-8 byte decode

我正在使用pickle.dumps()这样保存列表:

my_list = ['Hello', 'I', 'Have', 'a', 'question', 'camión']
my_pickle = pickle.dumps(my_list)       

一旦创建了泡菜,就将其上载到Azure Batch的容器中:

blob_service.block_service.create_blob_from_bytes('containername', 'filename', my_pickle)

并将其取回:

my_bytes = blob_service.block_service.get_blob_to_bytes('containername', 'filename')

我想要的(my_list)位于my_bytes.content内,如果我打印出来,我会得到:

b'\x80\x03]q\x00(X\x05\x00\x00\x00Helloq\x01X\x01\x00\x00\x00Iq\x02X\x04\x00\x00\x00Haveq\x03X\x01\x00\x00\x00aq\x04X\x08\x00\x00\x00questionq\x05X\x07\x00\x00\x00cami\xc3\xb3nq\x06e.'

为了使my_bytes返回列表,我尝试将其解码如下:

my_bytes.decode('utf-8')

但是出现以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

其他编码,例如latin-1,它没有给出错误,但正在返回

'\x80\x03]q\x00(X\x05\x00\x00\x00Helloq\x01X\x01\x00\x00\x00Iq\x02X\x04\x00\x00\x00Haveq\x03X\x01\x00\x00\x00aq\x04X\x08\x00\x00\x00questionq\x05X\x07\x00\x00\x00camiónq\x06e.'

而不是my_list

我已经在Internet上进行了搜索,以找出为什么会发生这种情况,但是我找不到任何对我有帮助的东西,因此任何建议或建议都非常受欢迎。我想从my_list获得my_bytes。请注意,我对如何解码my_bytes感兴趣。

2 个答案:

答案 0 :(得分:1)

使用pickle.loads反转pickle.dumps

>>> s = b'\x80\x03]q\x00(X\x05\x00\x00\x00Helloq\x01X\x01\x00\x00\x00Iq\x02X\x04\x00\x00\x00Haveq\x03X\x01\x00\x00\x00aq\x04X\x08\x00\x00\x00questionq\x05X\x07\x00\x00\x00cami\xc3\xb3nq\x06e.'
>>> import pickle
>>> pickle.loads(s)
['Hello', 'I', 'Have', 'a', 'question', 'camión']

答案 1 :(得分:1)

我最后要做的是将列表转换为字符串:

my_list=str(my_list)

并以以下方式将其上传到Blob存储:

BlockStorage('<account_name>', '<account_key>').block_service.create_blob_from_text('<container_name>', '<file_name>', my_list)

最后,要下载它:

my_file_as_str = BlockStorage('<account_name>', '<account_key>').block_service.get_blob_to_text('<container_name>', '<file_name>')

要返回列表,我现在需要做的事情:

my_list = eval(my_file_as_str.content)