28220


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

[code]

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

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

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

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

[ここ](https://stackoverflow.com/questions/33001373/loading-utf-8-file-in-
python-3-using-numpy-
genfromtxt)や[ここ](https://gist.github.com/tkamishima/52f3c1883bdf7d328e53ff2b2d455e0e)のように解決しようとしているのですが、解決できません。

[code]

    python
    import sys
    sys.getdefaultencoding()
    
[/code]

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

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


CC BY-SA 3.0
2016-08-12T09:19:50.163
28214
2016-08-12T12:18:08.330
2017-05-23T12:38:55.250
-1
17264
question
python macos numpy
numpy genfromtxt でutf-8ファイルを読み込む際のUnicodeDecodeErrorについて


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

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

**numpy-1.11/lib/npyio.py**

[code]

    # 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)
    
[/code]

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

**numpy-1.11/lib/_iotools.py**

[code]

    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')
    
[/code]

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

[code]

    >>> 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)
    
[/code]

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


CC BY-SA 3.0
2016-08-12T12:18:08.330
28220
2016-08-12T12:18:08.330
28214
answer