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

标签 python csv numpy utf-8

我有一个从 WHO 网站下载的 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)

我明白了

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

我猜 numpy 在读取字符串“Côte d'Ivoire”时有问题。该文件已正确编码为 UTF-8(根据我的文本编辑器)。我正在使用 Python 3.4.3 和 numpy 1.9.2。

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

最佳答案

注意最初的 2015 年日期。从那时起,genfromtxt 获得了一个encoding 参数。


在 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')

这意味着我可能可以打开一个“UTF-8”文件(常规的,而不是字节模式)和读取行,并将它们分配给数组的元素,如 x

但是 genfromtxt 坚持使用无法处理更大的 UTF-8 集(7 字节 v 8)的字节字符串 (ascii)。所以我需要在某个时候应用 decode 来获得 U 数组。

我可以使用 genfromtxt 将它加载到“S”数组中:

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')

并对单个元素应用解码:

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 让我指定转换器:

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 更容易使用.只需为每个字符串列指定转换器。

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

关于python - 使用 numpy.genfromtxt 在 Python 3 中加载 UTF-8 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33001373/

相关文章:

python - 用numpy旋转网格

python - Emacs24 Python 大纲覆盖模式中的覆盖行为

python - Python中的对象和对象有什么区别?

python - 通过 python urllib 和 urllib2 在本地主机上进行 HTTP 请求非常慢

csv - Spark 数据帧保存在 hdfs 位置的单个文件中

java - 查找距特定经纬度java距离的所有点

php - 解析csv文件php

python - 使用相同的字符串过滤前 3 行并在 python 中计算平均值

python - 如何根据平均值、中位数、第 1 和第 9 十分位数值生成数据集?

python - 无法将类型 'Timestamp' 与类型 'int' 进行比较 - 减去数据集