繁体   English   中英

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

[英]Loading UTF-8 file in Python 3 using numpy.genfromtxt

我有一个从 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' 编解码器无法解码位置 2 中的字节 0xc3:序号不在范围内 (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”文件(常规,而不是字节模式)和 readlines,并将它们分配给像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')

并将decode应用于单个元素:

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让我指定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')

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM