2015-06-26 19 views
22

Während Code python2-3 Portierung, bekomme ich diesen Fehler, wenn sie von einer URL zu lesenPython3 Fehler: initial_value muss str sein oder keine

TypeError: initial_value must be str or None, not bytes.

import urllib 
import json 
import gzip 
from urllib.parse import urlencode 
from urllib.request import Request 


service_url = 'https://babelfy.io/v1/disambiguate' 
text = 'BabelNet is both a multilingual encyclopedic dictionary and a semantic network' 
lang = 'EN' 
Key = 'KEY' 

    params = { 
     'text' : text, 
     'key' : Key, 
     'lang' :'EN' 

     } 

url = service_url + '?' + urllib.urlencode(params) 
request = Request(url) 
request.add_header('Accept-encoding', 'gzip') 
response = urllib.request.urlopen(request) 
if response.info().get('Content-Encoding') == 'gzip': 
      buf = StringIO(response.read()) 
      f = gzip.GzipFile(fileobj=buf) 
      data = json.loads(f.read()) 

Die Ausnahme bei dieser Linie geworfen wird

buf = StringIO(response.read()) 

Wenn ich Python2 verwende, funktioniert es gut.

+0

Können Sie bitte vollständige Traceback bieten? –

+0

Es gibt nur diesen Fehler und hält an. TypeError: initial_value muss Unicode oder None sein, nicht str – AMisra

+0

können Sie den Wert Ihrer Variablen 'URL' einschließen? Wenn ich es mit 'url = 'http: // www.google.com' versuche, ist der Code für mich in Ordnung. – maxymoo

Antwort

7

Das sieht aus wie ein anderes python3 bytes vs. str Problem. Ihre Antwort ist vom Typ bytes (was in Python 3 von str unterscheidet). Sie müssen es in eine Zeichenfolge zuerst mit response.read().decode('utf-8') sagen und dann StringIO darauf verwenden. Oder möchten Sie vielleicht BytesIO wie jemand sagte - aber wenn Sie erwarten, dass es str ist, ist der bevorzugte Weg zu decode in eine str zuerst.

+0

Es ist ein gzip-kodierter Inhalt, kein Text. – tynn

+1

Dann ist 'BytesIO' eine gute Idee. – gabhijit

Verwandte Themen