2015-06-26 52 views
22

python2 से 3 करने के लिए कोड पोर्टिंग करते हुए मैं इस त्रुटि जब किसी URLpython3 त्रुटि: initial_value str होना चाहिए या कोई नहीं

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

अपवाद इस लाइन

buf = StringIO(response.read()) 
पर फेंक दिया जाता है से पढ़ पाने

यदि मैं पायथन 2 का उपयोग करता हूं, तो यह ठीक काम करता है।

+0

क्या आप पूर्ण ट्रेसबैक प्रदान कर सकते हैं? –

+0

यह सिर्फ यह त्रुटि और रोक देता है। टाइप एरर: प्रारंभिक_वैल्यू यूनिकोड या कोई नहीं होना चाहिए, स्ट्र – AMisra

+0

नहीं क्या आप अपने चर 'url' का मान शामिल कर सकते हैं? जब मैं इसे 'url =' http: // www.google.com 'के साथ आज़माता हूं तो कोड मेरे लिए ठीक चलाता है – maxymoo

उत्तर

39

response.read()bytes का एक उदाहरण देता है जबकि StringIO केवल पाठ के लिए एक इन-मेमोरी स्ट्रीम है। इसके बजाय BytesIO का उपयोग करें।

What's new in Python 3.0 - Text Vs. Data Instead Of Unicode Vs. 8-bit से

The StringIO and cStringIO modules are gone. Instead, import the io module and use io.StringIO or io.BytesIO for text and data respectively.

7

यह एक और python3 bytes बनाम str समस्या की तरह लग रहा है। आपकी प्रतिक्रिया bytes प्रकार है (जो कि str से पायथन 3 में अलग है)। response.read().decode('utf-8') का उपयोग करके आपको इसे पहले स्ट्रिंग में लाने की आवश्यकता है और फिर StringIO का उपयोग करें। या आप BytesIO का उपयोग किसी भी व्यक्ति के रूप में करना चाह सकते हैं - लेकिन यदि आप इसे str होने की उम्मीद करते हैं, तो decode को पहले str में पसंदीदा तरीका है।

+0

यह gzip एन्कोडेड सामग्री टेक्स्ट नहीं है। – tynn

+1

फिर 'बाइट्सियो' एक अच्छा विचार है। – gabhijit

संबंधित मुद्दे