Python3错误: initialvalue 必须是 str 或 Nothing,带有 StringIO

将代码从 python2移植到 3时,从 URL 读取时会出现这个错误

TypeError: initialvalue 必须是 str 或 Nothing,而不是字节。

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

如果我使用 python2,它工作得很好。

93633 次浏览

response.read()返回 bytes的一个实例,而 StringIO是一个仅用于文本的内存流。

来自 Python 3.0的新特性: 文本 VS 数据代替 Unicode VS 8位

StringIOcStringIO模块不见了。相反,导入 io模块并分别对文本和数据使用 io.StringIOio.BytesIO

这看起来像是另一个 python3bytesstr的问题。您的响应类型为 bytes(python3与 str不同)。您需要首先使用 response.read().decode('utf-8') say 将它放入一个字符串中,然后在其上使用 StringIO。或者你可能想使用 BytesIO作为有人说-但如果你期望它是 str,首选的方法是 decode成为一个 str第一。

考虑使用 six. StringIO 而不是 io.StringIO。

如果您正在将代码从 python2迁移到 python3并使用 suds 旧版本,请为 python3使用“ suds-py3”