python3でname ‘StringIO’ is not definedが出たら

python2用に書かれたコードをpython3用に書き換えて実行すると、NameError: name 'StringIO' is not definedのようなエラーが出力される時がある。そういう時は、StringIOio.StringIOに書き換える必要がある。下記のpython2コードを3用に書き換えることで検証してみる。

1
2
3
4
5
# load the features to a feature matrix.
features = np.loadtxt(StringIO(raw_data), dtype=np.float32, delimiter=',', usecols=(0, 1, 2, 3))
# load the labels to a feature matrix
label_converter = lambda s : {'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2}[s]
labels = np.loadtxt(StringIO(raw_data), dtype=np.int, delimiter=',', usecols=(4,), converters={4: label_converter})

コードを修正した後で実行すると以下のようなエラーが出る。

----> 4 label_converter = lambda s : {'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2}[s]
      5 labels = np.loadtxt(io.StringIO(raw_data), dtype=np.int, delimiter=',', usecols=(4,), converters={4: label_converter})

KeyError: b'Iris-setosa'

このエラーは、b’を以下のようにIris-の前に付け加えてやれば解消する。

1
2
3
4
5
# load the features to a feature matrix.
features = np.loadtxt(io.StringIO(raw_data), dtype=np.float32, delimiter=',', usecols=(0, 1, 2, 3))
# load the labels to a feature matrix
label_converter = lambda s : {b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2}[s]
labels = np.loadtxt(io.StringIO(raw_data), dtype=np.int, delimiter=',', usecols=(4,), converters={4: label_converter})

Pythonプログラミングは、2から3に書き換えることによっても学習できそうな気がしてきた。

スポンサーリンク