德国骨科 发表于 2018-9-27 10:50:09

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

在将代码从python2移植到3的过程中,我读取URL时会出现这个错误
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())
The exception is thrown at this line
buf = StringIO(response.read())

此间少年 发表于 2018-9-27 10:51:45

response.read()返回一个bytes实例,StringIO是一个只用于文本的内存流。使用BytesIO代替。
Python 3.0的新特性——文本vs数据而不是Unicode vs 8位,StringIO和cStringIO模块都消失了。相反,导入io模块并使用io。StringIO或io。BytesIO分别表示文本和数据。

马猴烧酒 发表于 2018-9-27 10:52:54

这看起来像是另一个python3字节vs. str问题。你的reponse是字节类型(python 3中的类型与str不同)。您需要首先使用response.read().decode('utf-8')说,然后在它上使用StringIO。或者,你可能想要使用BytesIO,就像有人说的那样——但是如果你希望它是str,首选的方法是先解码为str。

2919005896 发表于 2018-9-30 08:47:19

对啊最烦遇到这种错误了:lol
页: [1]
查看完整版本: TypeError: initial_value must be str or None, not bytes.