运行代码出现以下报错
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 环境下创建,就会导致这种错误。
以下是几个解决方案:
- 确认文件的正确性:
- 确保您尝试加载的 pickle 文件没有损坏,并且是以正确的方式生成的。
- 使用合适的编码打开文件:
- 如果知道文件的正确编码,可以在使用 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 兼容性问题。
- 如果知道文件的正确编码,可以在使用 open 函数时指定正确的编码。不过对于 pickle 文件,通常不需要指定编码,因为 pickle 自身处理其内容的编码。如果您确定文件是以某种特定方式编码的,尝试使用该编码重新加载:
- 检查 pickle 文件的创建环境:
- 如果这个文件是在另一个 Python 环境(特别是 Python 2)中创建的,而您现在使用的是 Python 3,编码不兼容是常见的问题。使用 'latin1' 编码通常可以解决从 Python 2 到 Python 3 的迁移问题。
- 更新 pickle 使用方式:
- 考虑将数据重新以 Python 3 兼容的方式保存和加载。如果可能,将数据重新用 Python 3 的环境保存成 pickle 文件,然后再加载它。
成功解决错误!