Eha*_*awy 9 python utf-8 caffe
我正在尝试下载受BVLC训练的模型,我遇到了这个错误
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 110: invalid start byte
Run Code Online (Sandbox Code Playgroud)
我认为这是因为以下功能(完整代码)
# 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
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
Mar*_*ers 15
您正在打开一个非UTF-8编码的文件,而系统的默认编码设置为UTF-8.
由于您正在计算SHA1哈希,因此您应该将数据读取为二进制.这些hashlib函数要求您传入字节:
with open(filename, 'rb') as f:
return hashlib.sha1(f.read()).hexdigest() == sha1
Run Code Online (Sandbox Code Playgroud)
请注意b在文件模式中添加.
查看open()文档:
mode是一个可选字符串,用于指定打开文件的模式.它默认
'r'为在文本模式下打开以进行读取.[...]在文本模式下,如果编码未指定使用的编码是与平台相关的:locale.getpreferredencoding(False)被称为获取当前的本地编码.(对于读取和写入原始字节,请使用二进制模式并保留未指定的编码.)
并从hashlib模块文档:
现在,您可以使用update()方法为此对象提供类似字节的对象(通常为字节).
您没有指定以二进制模式打开文件,因此f.read()尝试将文件读取为UTF-8编码的文本文件,这似乎不起作用.但是因为我们采用字节的散列而不是字符串,所以编码是什么,甚至文件是否都是文本都无关紧要:只需打开它,然后将其作为二进制文件读取.
>>> 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
Run Code Online (Sandbox Code Playgroud)
但
>>> with open("test.h5.bz2","rb") as f: print(hashlib.sha1(f.read()).hexdigest())
21bd89480061c80f347e34594e71c6943ca11325
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37244 次 |
| 最近记录: |