2015-06-26 44 views
22

Podczas przenoszenie kodu z python2 do 3, otrzymuję ten błąd podczas odczytu z adresu URLbłąd Python3: musi initial_value być str lub Brak

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

jest wyjątek w tej linii

buf = StringIO(response.read()) 

Jeśli używam python2, działa dobrze.

+0

Czy możesz podać pełne informacje zwrotne? –

+0

Po prostu podaje ten błąd i zatrzymuje się. TypeError: initial_value musi być w Unicode lub None, a nie str – AMisra

+0

czy możesz dołączyć wartość zmiennej 'url'? kiedy próbuję go z 'url = 'http: // www.google.com'' kod działa dobrze dla mnie – maxymoo

Odpowiedz

7

To wygląda jak kolejny python3 bytes vs. str problem. Twoja odpowiedź jest typu bytes (która różni się w pythonie 3 od str). Najpierw musisz napisać go na ciąg, używając response.read().decode('utf-8'), a następnie użyć na nim StringIO. Lub może chcesz użyć BytesIO, jak ktoś powiedział - ale jeśli spodziewasz się, że będzie to str, preferowanym sposobem jest decode na str pierwszy.

+0

To treść zakodowana w gzipie, a nie tekst. – tynn

+1

Następnie "BytesIO" to dobry pomysł. – gabhijit