2016-04-24 12 views
4

dekodieren Ich versuche BVLC ausgebildetes Modell zum Herunterladen und ich bin fest mit diesem Fehler‚utf-8‘ Codec kann nicht Byte 0x80

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 110: invalid start byte 

Ich denke, es ist wegen der folgenden Funktion ist (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 

Irgendeine Idee, wie man das repariert?

+0

Die Fehlermeldung ist ganz klar. Entweder ist Ihre Datei nicht UTF8 oder sie ist beschädigt. – usr2564301

+0

Das ist, was ich habe, wenn ich versuche, 'f' ' <_io.TextIOWrapper name = 'models/bvlc_reference_caffenet/bvlc_reference_caffenet zu drucken.caffemodel 'mode =' r 'encoding =' utf8 '> ' –

+0

Interessant. Was passiert also, wenn Sie die Dateicodierung explizit angeben? Etwas wie 'open (Dateiname, 'r', encoding = 'utf8')'? –

Antwort

6

Sie öffnen eine Datei, die nicht UTF-8 kodiert ist, während die Standard-Kodierung für Ihr System auf UTF-8 gesetzt ist.

Da Sie einen SHA1-Hash berechnen, sollten Sie die Daten stattdessen als binär lesen. Die hashlib Funktionen benötigen Sie in Bytes übergeben:

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

Notiere die Zugabe von b im Dateimodus.

Siehe open() documentation:

Modus eine optionale Zeichenfolge, die den Modus angibt, in dem die Datei geöffnet wird. Es ist standardmäßig 'r', was bedeutet, dass es im Textmodus gelesen werden kann. [...] Im Textmodus, wenn Codierung nicht angegeben ist, ist die Codierung plattformabhängig: locale.getpreferredencoding(False) wird aufgerufen, um die aktuelle Gebietsschema-Codierung zu erhalten. (Zum Lesen und Schreiben von rohem Bytes verwendet Binär-Modus und verlassen Codierung nicht näher bezeichnet.)

und von dem hashlib module documentation:

Sie jetzt dieser Aufgabe mit Bytes ähnliche Objekte zuführen kann (in der Regel Bytes) Verwenden Sie die update() -Methode.

4

Sie haben nicht angegeben, die Datei im Binärmodus zu öffnen, daher versucht f.read(), die Datei als UTF-8-codierte Textdatei zu lesen, die nicht zu funktionieren scheint. Aber da wir den Hash Bytes, nicht von Strings nehmen, ist es egal, was die Codierung ist, oder auch, ob die Datei überhaupt Text ist: Öffnen Sie es einfach und lesen Sie es dann als Binärdatei .

>>> 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 

aber

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

danke DSM, das 'b' löste es. –

+0

Nach so vielen Versuchen war es das "b". – Deepank

1

Da es keine einziger Hinweis in der Dokumentation noch src-Code ist, habe ich keine Ahnung, warum, aber mit dem b char (i für binäres erraten) vollständig funktioniert (tf-Version: 1.1.0):

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

For more information, check out: gfile

Verwandte Themen