"'utf-8' 编解码器无法解码字节 0x80。"

17 浏览
0 Comments

"'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日
0
0 Comments

你没有指定以二进制模式打开文件,所以 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

0
0 Comments

您正在打开一个非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)提供给此对象。

0