2016-04-24 71 views
4

我試圖下載BVLC訓練模式,我堅持了這個錯誤「UTF-8」編解碼器不能解碼字節0x80的

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

錯誤消息是很清楚。您的文件根本不是UTF8,或者它已損壞。 – usr2564301

+0

這就是當我嘗試打印'f' '<_io.TextIOWrapper name ='models/bvlc_reference_caffenet/bvlc_reference_caffenet時得到的結果。caffemodel'mode ='r'encoding ='utf8'>' –

+0

有趣。那麼當你明確指定文件編碼時會發生什麼?像'open(filename,'r',encoding ='utf8')''? –

回答

6

您正在打開一個文件,是不是UTF-8編碼,同時爲您的系統默認的編碼設置爲UTF-8。

由於您正在計算SHA1哈希,您應該讀取數據爲二進制。該hashlib功能需要您以字節爲單位傳遞:

with open(filename, 'rb') as f: 
    return hashlib.sha1(f.read()).hexdigest() == sha1 

注意在文件模式添加b

open() documentation

模式是一個可選的字符串,指定在其中打開文件的模式。它默認爲'r',這意味着可以在文本模式下閱讀。 在文本模式下,如果未指定編碼,則所用編碼與平臺相關:調用locale.getpreferredencoding(False)以獲取當前語言環境編碼。 (閱讀和寫作的原始字節使用二進制模式,並留下編碼不確定的。)

,並從hashlib module documentation

現在,您可以養活這個對象的字節狀物體(通常是字節)使用update()方法。

4

您沒有指定以二進制模式打開文件,因此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 

>>> with open("test.h5.bz2","rb") as f: print(hashlib.sha1(f.read()).hexdigest()) 
21bd89480061c80f347e34594e71c6943ca11325 
+0

感謝帝斯曼,'b'解決了它。 –

+0

經過如此多的嘗試,就是'b'。 – Deepank

1

由於沒有在文檔也不SRC碼單提示,我不知道爲什麼,但使用B CHAR(我猜二進制)完全工作(TF-版本:1.1.0):

image_data = tf.gfile.FastGFile(filename, 'rb').read() 

For more information, check out: gfile

相關問題