首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python3错误:带有StringIO的initial_value必须为字符串或无

Python3错误:带有StringIO的initial_value必须为字符串或无
EN

Stack Overflow用户
提问于 2015-06-26 12:33:16
回答 4查看 80.1K关注 0票数 77

在将代码从python2移植到3时,我在读取URL时遇到以下错误

TypeError: initial_value必须是字符串或无,而不是字节。

代码语言:javascript
复制
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())

异常在此行抛出

代码语言:javascript
复制
buf = StringIO(response.read())  

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-26 15:28:52

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

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

StringIOcStringIO模块消失了。相反,您可以导入io模块,并使用io.StringIOio.BytesIO分别处理文本和数据。

票数 126
EN

Stack Overflow用户

发布于 2015-06-26 15:31:56

这看起来像是另一个python3 bytesstr的问题。您的响应类型为bytes (在Python3中与str中的类型不同)。您需要首先使用response.read().decode('utf-8')将其转换为字符串,然后对其使用StringIO。或者你可能想要像别人说的那样使用BytesIO --但是如果你希望它是str,首选的方法是先decode到一个str中。

票数 25
EN

Stack Overflow用户

发布于 2019-07-09 01:05:28

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31064981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档