"'utf-8' 编解码器无法解码字节 0x80。"
"'utf-8' 编解码器无法解码字节 0x80。"
我正在尝试下载BVLC训练的模型,但我卡在了这个错误上
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 110: invalid start byte
我认为这是因为以下函数(完整代码)
# Closure-d function for checking SHA1. def model_checks_out(filename=model_filename, sha1=frontmatter['sha1']): with open(filename, 'r') as f: return hashlib.sha1(f.read()).hexdigest() == sha1
有没有什么办法可以修复这个问题?
admin 更改状态以发布 2023年5月21日
你没有指定以二进制模式打开文件,所以 f.read()
尝试将文件作为 UTF-8 编码的文本文件读取,但似乎不起作用。但是由于我们只对字节的哈希值取值,编码甚至是否为文本文件都无所谓:只需打开它,然后作为二进制文件读取。
>>> with open("test.h5.bz2","r") as f: print(hashlib.sha1(f.read()).hexdigest()) Traceback (most recent call last): File "", line 1, in with open("test.h5.bz2","r") as f: print(hashlib.sha1(f.read()).hexdigest()) File "/home/dsm/sys/pys/Python-3.5.1-bin/lib/python3.5/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 10: invalid start byte
但是
>>> with open("test.h5.bz2","rb") as f: print(hashlib.sha1(f.read()).hexdigest()) 21bd89480061c80f347e34594e71c6943ca11325
您正在打开一个非UTF-8编码的文件,而您的系统默认编码设置为UTF-8。
由于您正在计算SHA1哈希值,因此应该将数据读取为二进制格式。 hashlib
函数需要您传入字节:
with open(filename, 'rb') as f: return hashlib.sha1(f.read()).hexdigest() == sha1
请注意在文件模式中添加 b
。
请参阅 open()
文档:
mode是一个可选字符串,它指定打开文件的模式。它默认为
'r'
,这意味着以文本模式打开以供阅读。 [...] 在文本模式下,如果未指定编码,则使用的编码取决于平台:locale.getpreferredencoding(False)
被调用以获取当前区域设置编码。(要读写原始字节,请使用二进制模式并将编码留空。)
并来自于hashlib
模块文档:
现在,您可以使用 update() 方法将类似字节的对象(通常是 bytes)提供给此对象。