Python3 error: initial_value must be str or None, with StringIO
Python3 error: initial_value must be str or None, with StringIO
将代码从 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())
这一行抛出异常
buf = StringIO(response.read())
如果我使用 python2,它工作正常。
response.read()
returns bytes
的一个实例,而 StringIO
is an in-memory stream for text only. Use 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.
这看起来像是另一个 python3 bytes
与 str
的问题。您的响应类型为 bytes
(在 python 3 中不同于 str
)。您需要先使用 response.read().decode('utf-8')
say 将其转换为字符串,然后再使用 StringIO
。或者你可能想像某人说的那样使用 BytesIO
- 但如果你希望它是 str
,首选方法是先将 decode
变成 str
。
考虑使用 six.StringIO 而不是 io.StringIO。
如果您正在将代码从 python2 迁移到 python3 并使用 suds 旧版本,请为 python3
使用“suds-py3”
将代码从 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())
这一行抛出异常
buf = StringIO(response.read())
如果我使用 python2,它工作正常。
response.read()
returns bytes
的一个实例,而 StringIO
is an in-memory stream for text only. Use BytesIO
相反。
来自What's new in Python 3.0 - Text Vs. Data Instead Of Unicode Vs. 8-bit
The
StringIO
andcStringIO
modules are gone. Instead, import theio
module and useio.StringIO
orio.BytesIO
for text and data respectively.
这看起来像是另一个 python3 bytes
与 str
的问题。您的响应类型为 bytes
(在 python 3 中不同于 str
)。您需要先使用 response.read().decode('utf-8')
say 将其转换为字符串,然后再使用 StringIO
。或者你可能想像某人说的那样使用 BytesIO
- 但如果你希望它是 str
,首选方法是先将 decode
变成 str
。
考虑使用 six.StringIO 而不是 io.StringIO。
如果您正在将代码从 python2 迁移到 python3 并使用 suds 旧版本,请为 python3
使用“suds-py3”