1. ホーム
  2. python

Python3 エラー: Initial_value は str か None でなければならない、StringIO を使用する場合

2023-08-09 19:21:24

質問

からコードを移植しているときに python2 から 3 というように、URLから読み込むと、このようなエラーが発生します。

TypeError: initial_valueはbyteではなく、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を使用すると、正常に動作します。

どのように解決するのですか?

response.read() のインスタンスを返します。 bytes 一方 StringIO はテキストのみのインメモリストリームです。使用方法 BytesIO を使用します。

から Python 3.0 の新機能 - Unicode 対 8 ビットではなく、Text 対 Data。

この StringIOcStringIO モジュールはなくなりました。その代わりに io モジュールをインポートして io.StringIO または io.BytesIO で、それぞれテキストとデータ用です。