【问题标题】:Python3 error: initial_value must be str or None, with StringIOPython3 错误:initial_value 必须是 str 或 None,使用 StringIO
【发布时间】:2015-09-12 22:10:11
【问题描述】:

在将代码从 python2 移植到 3 时,从 URL 读取时出现此错误

TypeError:initial_value 必须是 str 或 None,而不是字节。

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,它可以正常工作。

【问题讨论】:

  • 能否提供完整的追溯?
  • 它只是给出这个错误并停止。 TypeError: initial_value 必须是 unicode 或 None,而不是 str
  • 你能包含你的变量url的值吗?当我尝试使用 url = 'http://www.google.com' 时,代码对我来说运行良好
  • 对于因pandas.read_csv() 打嗝推断ASCII 输入的错误编码而来到这里的任何人,请使用encoding='utf8''latin1' 强制它。

标签: python python-3.x urllib urllib2 stringio


【解决方案1】:

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

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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 处理文本和数据。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2018-11-25
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 1970-01-01
        • 2015-04-19
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多