我试图下载经过BVLC培训的模型而且我遇到了这个错误
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 110: invalid start byte
我认为这是因为以下功能(complete code)
# 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
知道如何解决这个问题吗?
答案 0 :(得分:15)
您正在打开非UTF-8编码的文件,而系统的默认编码设置为UTF-8。
由于您正在计算SHA1哈希值,因此您应该将数据读取为 binary 。 hashlib
函数要求您传入字节:
with open(filename, 'rb') as f:
return hashlib.sha1(f.read()).hexdigest() == sha1
请注意在文件模式中添加b
。
mode 是一个可选字符串,用于指定打开文件的模式。它默认为
'r'
,这意味着可以在文本模式下打开。 [...] 在文本模式下,如果未指定 encoding ,则使用的编码取决于平台:调用locale.getpreferredencoding(False)
以获取当前的区域设置编码。 (对于读取和写入原始字节,请使用二进制模式并保留 encoding 未指定。)
来自hashlib
module documentation:
现在可以使用update()方法为此对象提供类似字节的对象(通常为字节)。
答案 1 :(得分:5)
您没有指定以二进制模式打开文件,因此f.read()
正在尝试将文件读取为UTF-8编码的文本文件,这似乎不起作用。但是由于我们采用 bytes 的哈希值,而不是 strings 的哈希值,因此编码是什么并不重要,甚至文件是否都是文本:只是打开它,然后将其作为二进制文件读取。
>>> with open("test.h5.bz2","r") as f: print(hashlib.sha1(f.read()).hexdigest())
Traceback (most recent call last):
File "<ipython-input-3-fdba09d5390b>", line 1, in <module>
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
答案 2 :(得分:2)
由于文档和src代码中没有一个提示,我不知道为什么,但使用b char(我猜二进制)完全有效(tf-version:1.1.0):
image_data = tf.gfile.FastGFile(filename, 'rb').read()