使用numpy.genfromtxt在Python 3中加载UTF-8文件

Jus*_*der 8 python csv numpy utf-8

我有一个CSV文件,我从世卫组织网站下载(http://apps.who.int/gho/data/view.main.52160,下载,"CSV格式的多用途表格").我尝试将文件加载到numpy数组中.这是我的代码:

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

我明白了

UnicodeDecodeError:'ascii'编解码器无法解码位置2中的字节0xc3:序数不在范围内(128).

我想numpy在阅读字符串"Côted'Ivoire"时遇到了问题.该文件正确编码为UTF-8(根据我的文本编辑器).我使用的是Python 3.4.3和numpy 1.9.2.

我究竟做错了什么?如何将文件读入numpy?

hpa*_*ulj 8

在Python3中,我可以这样做:

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')
Run Code Online (Sandbox Code Playgroud)

这意味着我可能打开一个'UTF-8'文件(常规,非字节模式)和readlines,并将它们分配给数组元素x.

genfromtxt坚持使用字节字符串(ascii)进行操作,这些字符串无法处理较大的UTF-8集合(7字节v 8).所以我需要decode在某个时候申请获得一个U数组.

我可以将它加载到'S'数组中genfromtxt:

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')
Run Code Online (Sandbox Code Playgroud)

并适用decode于个别元素:

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

In [325]: print _
Côte d'Ivoire
Run Code Online (Sandbox Code Playgroud)

或者用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
Run Code Online (Sandbox Code Playgroud)

genfromtxt让我指出converters:

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

如果csv混合使用字符串和数字,这种converters方法比使用它更容易使用np.char.decode.只需为每个字符串列指定转换器.

(请参阅我之前对Python2尝试的编辑).

  • 谢谢你的回答。有用!我刚开始使用 Python,我发现 numpy 无法立即读取 UTF-8,这很奇怪。我已经读到 Python 很容易并且在开发时考虑到了简单性和易用性,但阅读 UTF-8 需要额外的转换?我以为我们生活在 2015 年。 (3认同)