1. ホーム
  2. Machine Learning

Python プロンプト TypeError: write() の引数はバイトではなく str でなければなりません。

2022-02-18 19:52:24

機械学習の実践」の決定木の章のコードを書き出していたとき、構築した木を保存して読み込もうとしたら

pickle.dump(inputTree, fw)
TypeError: write() の引数はbyteではなくstrでなければならない。

メッセージを見ると、write()の引数はバイトではなく、文字でなければならないとのことです。ざっと見た感じでは、どういう意味なのかさっぱりわかりませんでした。ソースコードを開くと、次のような記述がありました。

The optional *protocol* argument tells the pickler to use the
The optional *protocol* argument tells the pickler to use the given protocol; supported protocols are 0, 1, 2, 3 and 4.
default protocol is 3; a backward-incompatible protocol designed
for Python 3.

Specifying a negative protocol version selects the highest
The higher the protocol used, the
more recent the version of Python needed to read the pickle
produced.

The *file* argument must have a write() method that accepts a
It can thus be a file object opened for
BytesIO instance, or any other custom
BytesIO instance, or any other custom object that meets this interface.

If *fix_imports* is True and *protocol* is less than 3, pickle
will try to map the new Python 3 names to the old module names
used in Python 2, so that the pickle data stream is readable
with Python 2.



2段落目からカウントしてわかるように、この関数ではファイルをバイナリで読み書きする必要があるので、定義されている2つの関数(上の画像で青くマークされている) fw=open(filename,'w') and fr=open(filename,'r') を fw= open(filename,'wb') and fr=open(filename,'rb') に変更するだけでも問題は完全に解決するのですが、そのために、この関数は、(1)ファイル名(fw)、(fl)のように、バイナリで読み書きする必要があります。