解决 UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xd8 in position 5: ordinal not in range(128)

文章讲述了在从Python2迁移到Python3的过程中,遇到pickle文件的UnicodeDecodeError,主要涉及ASCII编码问题。作者提供了检查文件编码、使用特定编码如latin1加载文件以及更新pickle使用方式的解决方案。
摘要由CSDN通过智能技术生成

运行代码出现以下报错

Traceback (most recent call last): File "preprocess/sunrgbd/sunrgbd_process.py", line 704, in <module> main() File "preprocess/sunrgbd/sunrgbd_process.py", line 698, in main prepare_data(False, shift=False) File "preprocess/sunrgbd/sunrgbd_process.py", line 66, in prepare_data bin = PATH.bins() File "./config.py", line 87, in bins avg_size = pickle.load(open(template_path,'rb')) UnicodeDecodeError: 'ascii' codec can't decode byte 0xd8 in position 5: ordinal not in range(128)

源代码使用python2语言,使用python3代码出现错误,print("avg_size",avg_size.keys())

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]

替换为以上内容可以解决,但是仍然存在其他错误,如下:

Traceback (most recent call last):
  File "preprocess/sunrgbd/sunrgbd_process.py", line 686, in <module>
    main()
  File "preprocess/sunrgbd/sunrgbd_process.py", line 680, in main
    prepare_data(False, shift=False)
  File "preprocess/sunrgbd/sunrgbd_process.py", line 186, in prepare_data
    box_set['size_reg'] = size_avg_residual(box['3dbdb']['coeffs'][0], size_template, box['2dbdb']['classname'])
  File "preprocess/sunrgbd/sunrgbd_process.py", line 507, in size_avg_residual
    size_residual = (coeffs - avg_size[obj_category]) / avg_size[obj_category]
KeyError: 'dresser'

还有其他一系列错误,感觉不对,回头重新解决原始错误。

这通常发生在尝试使用不兼容的编码方式读取文件时。错误信息中的 'ascii' codec can't decode byte 0xd8 in position 5 表示程序试图使用 ASCII 编码来解码一个可能不是用 ASCII 编码的文件。在您的情况下,这个错误发生在使用 pickle 库加载一个文件时。

解决方案

错误发生在尝试从一个模板路径加载 pickle 数据时。pickle.load 函数默认使用 ASCII 解码读取数据,但如果 pickle 文件包含非 ASCII 字符或在非 ASCII 环境下创建,就会导致这种错误。

以下是几个解决方案:

  1. 确认文件的正确性:
    • 确保您尝试加载的 pickle 文件没有损坏,并且是以正确的方式生成的。
  2. 使用合适的编码打开文件:
    • 如果知道文件的正确编码,可以在使用 open 函数时指定正确的编码。不过对于 pickle 文件,通常不需要指定编码,因为 pickle 自身处理其内容的编码。如果您确定文件是以某种特定方式编码的,尝试使用该编码重新加载:

      pythonCopy code
      importio importpickle # 使用 'latin1' 试图解决兼容性问题withopen(template_path, 'rb') asfile: avg_size = pickle.load(file, encoding='latin1')
    • 选用 'latin1' 编码是因为它可以映射到 0-255 的所有字节,这通常用于解决从 Python 2 到 Python 3 迁移中的 pickle 兼容性问题。
  3. 检查 pickle 文件的创建环境:
    • 如果这个文件是在另一个 Python 环境(特别是 Python 2)中创建的,而您现在使用的是 Python 3,编码不兼容是常见的问题。使用 'latin1' 编码通常可以解决从 Python 2 到 Python 3 的迁移问题。
  4. 更新 pickle 使用方式:
    • 考虑将数据重新以 Python 3 兼容的方式保存和加载。如果可能,将数据重新用 Python 3 的环境保存成 pickle 文件,然后再加载它。

 成功解决错误!

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值