2015-10-07 15 views
8

私はWHOサイト(http://apps.who.int/gho/data/view.main.52160、ダウンロード、「CSV形式の多目的テーブル」)からダウンロードしたCSVファイルを持っています。私はファイルを読みにくい配列にロードしようとします。numpy.genfromtxtを使用してPython 3でUTF-8ファイルを読み込み

import numpy 
#U75 - unicode string of max. length 75 
world_alcohol = numpy.genfromtxt("xmart.csv", dtype="U75", skip_header=2, delimiter=",") 
print(world_alcohol) 

そして私は、私はnumpyのは、文字列「コートジボワール」を読んで問題があることが推測

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128).

を得る:ここに私のコードです。ファイルは正しくエンコードされたUTF-8です(私のテキストエディタによると)。私はPython 3.4.3とnumpy 1.9.2を使用しています。

私は間違っていますか?ファイルをnumpyに読み込むにはどうすればよいですか?

答えて

8

のpython3では私が行うことができます。私はおそらく「UTF-8」ファイル(通常のではなく、バイトモード)、およびreadlinesを開き、のような配列の要素に割り当てることができ意味

In [224]: txt = "Côte d'Ivoire" 
In [225]: x = np.zeros((2,),dtype='U20') 
In [226]: x[0] = txt 
In [227]: x 
Out[227]: 
array(["Côte d'Ivoire", ''], dtype='<U20') 

x

しかし、genfromtxtは、より大きなUTF-8セット(7バイトv 8)を処理できないバイト文字列(ascii)での操作を主張しています。だから配列を取得するには、ある時点でdecodeを適用する必要があります。

In [258]: txt="Côte d'Ivoire" 
In [259]: a=np.genfromtxt([txt.encode()],delimiter=',',dtype='S20') 
In [260]: a 
Out[260]: 
array(b"C\xc3\xb4te d'Ivoire", dtype='|S20') 

を、個々の要素にdecodeを適用する:

Iは、genfromtxtと 'S' 配列にロードすることができ

In [261]: print(a.item().decode()) 
Côte d'Ivoire 

In [325]: print _ 
Côte d'Ivoire 

または配列の各要素に適用するnp.char.decodeを使用します:

In [263]: np.char.decode(a) 
Out[263]: 
array("Côte d'Ivoire", dtype='<U13') 
In [264]: print(_) 
Côte d'Ivoire 

genfromtxt LET

In [297]: np.genfromtxt([txt.encode()],delimiter=',',dtype='U20', 
    converters={0:lambda x: x.decode()}) 
Out[297]: 
array("Côte d'Ivoire", dtype='<U20') 

csvは、文字列と数値が混在している場合は、このconvertersアプローチがnp.char.decodeより使いやすくなります:私はconvertersを指定しますよ。各文字列に対してコンバーターを指定するだけです。

(以前の私のPython2試行の編集を参照してください)。

+0

OPではありませんが、明確かつ有用な回答の蓄積に感謝します。 – KobeJohn

+1

ありがとうございました。できます! 私はちょうどPythonで始まりました。私はnumpyがUTF-8をすぐに読むことができないのが奇妙だと感じました。私はPythonがシンプルで使いやすく、しかもUTF-8を読むことは追加の変換が必要であることを読んだことがありますか?私たちは2015年に住んでいると思いました。 – JustAC0der

関連する問題