'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()方法为该对象提供类似字节的对象(通常为字节)。