numpy genfromtxt でutf-8ファイルを読み込む際のUnicodeDecodeErrorについて

投稿者: Anonymous

python3.4, OSX 10.9.5, numpy 1.11.0 を用いています。

import numpy as np
data = np.genfromtxt("hoge.tsv", delimiter="t", names=True, dtype=float, converters={1: lambda x: x.decode('utf_8')})

を行ったところ、UnicodeDecodeErrorが出ます。

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe3 in position 1: ordinal not in range(128)

hoge.tsvはutf-8できちんとコーディングできています。
一行目がヘッダー、二行目以下は小数や整数が並んでいます。
一行目のヘッダーのところにのみ日本語が用いられていて、
「日付_2015年」「性別」のようなヘッダーがついています。
ヘッダー行を抜かしたファイルを作成したところ、正しく読み込むことができました。

ここここのように解決しようとしているのですが、解決できません。

python
import sys
sys.getdefaultencoding()

‘utf-8’
とpython自体のデフォルトはutf-8であることは確認しています。

dtype=float の指定などがいけないのでしょうか?
どのようにすれば良いのでしょうか。
ご教示いただけますと幸いです。

解決

エラーメッセージから、該当するソースコード部分を見てみます。

numpy.genfromtxt() の呼び出しで names=True を指定すると、ヘッダ行に対して _bytes_to_name() が呼ばれることになります。

numpy-1.11/lib/npyio.py

# Check the names and overwrite the dtype.names if needed
if names is True:
    names = validate_names([_bytes_to_name(_.strip())
                            for _ in first_values])
    first_line = asbytes('')
elif _is_string_like(names):
    names = validate_names([_.strip() for _ in names.split(',')])
elif names:
    names = validate_names(names)

_bytes_to_name() ではヘッダ行のバイト列を ASCII コーデックにデコードしようとしてエラーが発生する事になります。

numpy-1.11/lib/_iotools.py

if sys.version_info[0] >= 3:
    def _bytes_to_complex(s):
        return complex(s.decode('ascii'))

    def _bytes_to_name(s):
        return s.decode('ascii')

仕方がないので、ヘッダ(カラム名のリスト)を別途作成することにします。

>>> import numpy as np
>>> with open('hoge.tsv', 'rb') as f:
>>>   header = f.readline().decode('utf-8').strip('n').split('t')
>>>   data = np.genfromtxt(f, delimiter='t', names=header, dtype=float)

numpy.genfromtxt() への入力はバイト列にする必要があるので open('hoge.tsv', 'rb') としています。そのため、ヘッダ行を utf-8 にデコードしています。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *