write() argument must be str, not bytes を解決したいです。
もともとpython2系で書かれていたコードをpython3で書き換えているのですが、途中でこのエラーで詰まってしまいました。
よろしくお願いします。
以下がそのコードです。
python
1#%% 2import time 3import math 4import sys 5import argparse 6import pickle 7import codecs 8 9import numpy as np 10from chainer import cuda, Variable, FunctionSet 11import chainer.functions as F 12from CharRNN import CharRNN, make_initial_state 13 14sys.stdout = codecs.getwriter('utf_8')(sys.stdout) 15 16#%% arguments 17parser = argparse.ArgumentParser() 18 19parser.add_argument('--model', type=str, required=True) 20parser.add_argument('--vocabulary', type=str, required=True) 21 22parser.add_argument('--seed', type=int, default=123) 23parser.add_argument('--sample', type=int, default=1) 24parser.add_argument('--primetext', type=str, default='') 25parser.add_argument('--length', type=int, default=2000) 26parser.add_argument('--gpu', type=int, default=-1) 27 28args = parser.parse_args() 29 30np.random.seed(args.seed) 31 32# load vocabulary 33vocab = pickle.load(open(args.vocabulary, 'rb')) 34ivocab = {} 35for c, i in vocab.items(): 36 ivocab[i] = c 37 38# load model 39model = pickle.load(open(args.model, 'rb')) 40n_units = model.embed.W.data.shape[1] 41 42if args.gpu >= 0: 43 cuda.get_device(args.gpu).use() 44 model.to_gpu() 45 46# initialize generator 47state = make_initial_state(n_units, batchsize=1, train=False) 48if args.gpu >= 0: 49 for key, value in state.items(): 50 value.data = cuda.to_gpu(value.data) 51 52prev_char = np.array([0], dtype=np.int32) 53if args.gpu >= 0: 54 prev_char = cuda.to_gpu(prev_char) 55 56if len(args.primetext) > 0: 57 for i in unicode(args.primetext, 'utf-8'): 58 sys.stdout.write(i) 59 prev_char = np.ones((1,), dtype=np.int32) * vocab[i] 60 if args.gpu >= 0: 61 prev_char = cuda.to_gpu(prev_char) 62 63 state, prob = model.forward_one_step(prev_char, prev_char, state, train=False) 64 65for i in range(args.length): 66 state, prob = model.forward_one_step(prev_char, prev_char, state, train=False) 67 68 if args.sample > 0: 69 probability = cuda.to_cpu(prob.data)[0].astype(np.float64) 70 probability /= np.sum(probability) 71 index = np.random.choice(range(len(probability)), p=probability) 72 else: 73 index = np.argmax(cuda.to_cpu(prob.data)) 74 sys.stdout.write(ivocab[index]) 75 76 prev_char = np.array([index], dtype=np.int32) 77 if args.gpu >= 0: 78 prev_char = cuda.to_gpu(prev_char) 79 80print 81
出力は以下になります。
Traceback
1 File "sample.py", line 74, in <module> 2 sys.stdout.write(ivocab[int(index)]) 3 File "/Users/***********/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/codecs.py", line 377, in write 4 self.stream.write(data) 5TypeError: write() argument must be str, not bytes 6コード
To fix this, you can encode the Unicode string as bytes before writing
python
index = np.argmax(cuda.to_cpu(prob.data))
character = ivocab[index]
sys.stdout.write(character.encode('utf-8'))
This will encode the Unicode character using UTF-8, giving us a byte string that sys.stdout.write() can accept.
The full fix would be:
python
index = np.argmax(cuda.to_cpu(prob.data))
character = ivocab[index]
sys.stdout.write(character.encode('utf-8'))
This encodes the character to bytes, resolving the TypeError and allowing the code to run correctly in Python 3. Hope this explanation and solution help

回答1件
あなたの回答
tips
プレビュー