【问题标题】:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byteUnicodeDecodeError:“utf-8”编解码器无法解码位置 0 的字节 0x80:无效的起始字节
【发布时间】:2018-10-03 15:17:14
【问题描述】:

我正在使用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_bytes 得到my_list。请注意,我对如何解码 my_bytes 感兴趣。

【问题讨论】:

  • 如果使用 pickle.dumps 将列表编码为字节,则使用 pickle.loads 将字节解码为列表。为什么你会有其他想法? @Auqarthur 是正确的。
  • 我正在将我的泡菜文件上传到 Azure Batch,当我尝试使用 blob_service.block_service.get_blob_to_bytes() 从那里取回它时,它返回的字节数如 my_bytes 所示,我试图弄清楚如何从my_biyes 获取my_list。据我所知,我不能再使用pickle,因为我的文件不会在本地...
  • 当然可以。
  • @Mark Tolonen 我已经编辑了我的问题,你介意看看它并指出我应该在pickle.load() 中传递什么吗?
  • my_list = pickle.loads(my_bytes.content)。注意loads(从字符串加载)不是load(从文件加载)。

标签: python utf-8 byte decode


【解决方案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']

【讨论】:

    【解决方案2】:

    我最终所做的是将列表转换为字符串:

    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)
    

    【讨论】:

    • 在我不断尝试使用 pickle 的情况下发现这很有用
    猜你喜欢
    • 2021-09-21
    • 2023-02-07
    • 1970-01-01
    • 2020-09-22
    • 2021-12-01
    • 2016-05-13
    • 2020-02-06
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多