请注意原来的 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 尝试的编辑)。