'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
任何想法如何解决这个问题?
问题答案:
您正在打开的文件不是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()方法为该对象提供类似字节的对象(通常为字节)。