Python3中的numpygenfromtxt问题

Python3中的numpygenfromtxt问题,python,numpy,python-3.x,genfromtxt,Python,Numpy,Python 3.x,Genfromtxt,我正在尝试将genfromtxt与Python3结合使用,以读取包含字符串和数字的简单csv文件。例如,类似(以下简称“test.csv”): 对于Python2,以下功能非常有效: import numpy data=numpy.genfromtxt("test.csv", delimiter=",", dtype=None) # Now data is something like [(1, 'a') (2, 'b') (3, 'c')] 在Python3中,相同的代码返回[(1,b'a'

我正在尝试将
genfromtxt
与Python3结合使用,以读取包含字符串和数字的简单csv文件。例如,类似(以下简称“test.csv”):

对于Python2,以下功能非常有效:

import numpy
data=numpy.genfromtxt("test.csv", delimiter=",", dtype=None)
# Now data is something like [(1, 'a') (2, 'b') (3, 'c')]
在Python3中,相同的代码返回
[(1,b'a')(2,b'b')(3,b'c')]
。这在某种程度上是由于Python3读取文件的方式不同。因此,我使用转换器对字符串进行解码:

decodef = lambda x: x.decode("utf-8")
data=numpy.genfromtxt("test.csv", delimiter=",", dtype="f8,S8", converters={1: decodef})
这适用于Python2,但不适用于Python3(相同的
[(1,b'a')(2,b'b')(3,b'c')])
输出。 但是,如果在Python3中,我使用上面的代码只读取一列:

data=numpy.genfromtxt("test.csv", delimiter=",", usecols=(1,), dtype="S8", converters={1: decodef})
输出字符串是
['a''b''c']
,已按预期解码

我还尝试将该文件作为带有
'rb'
模式的
打开的
输出,正如在中建议的那样,但没有任何改进

为什么转换器在只读取一列时工作,而在读取两列时不工作?您能告诉我在Python3中使用
genfromtxt
的正确方法吗?我做错了什么吗?提前感谢您!

在Python3中,正在编写

dtype=“S8”

(或NumPy的genfromtxt中“S#”)的任何变体)都会生成一个字节字符串

dtype=str


相反。

我的问题的答案是使用unicode字符串的
dtype
U2

多亏了E.凯勒的回答,我找到了解决办法。 如果在
dtype
定义中使用
str
代替
S8
,则第二列的输出为空:

numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,str')
输出为:

array([(1.0, ''), (2.0, ''), (3.0, '')], dtype=[('f0', '<f16'), ('f1', '<U0')])
这将给出预期的输出:

array([(1.0, 'a'), (2.0, 'b'), (3.0, 'c')], dtype=[('f0', '<f16'), ('f1', '<U2')])
array([(1.0,'a'),(2.0,'b'),(3.0,'c')],dtype=[('f0'),'
在我的例子中,第一列包含一个0或1的情绪值,第二列是一个由许多字符组成的字符串,代表这个例子中的一条tweet。
dtype='U'将b'从包含中删除

因此,在您的情况下,它将是:
data=numpy.genfromtxt(“test.csv”,delimiter=“,”,dtype='U')

这里的问题是什么?@wim编辑。现在这个问题看起来应该更清楚了。这里也有同样的问题。一开始我对使用字节b'文字而不是预期的字符串感到非常困惑。我的csv文件有两列:带0或1值的情感;以及文本(UTF-16)使用这种解码方法单独处理列是可行的谢谢你的回答。但是,它并没有解决我的问题,因为使用
str
的输出:
numpy.genfromtxt(“test.csv”,delimiter=“,”,dtype='f8,str')
为第二列中的数据提供了一个空字符串(和
dtype

numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,U2')
array([(1.0, 'a'), (2.0, 'b'), (3.0, 'c')], dtype=[('f0', '<f16'), ('f1', '<U2')])
training = np.genfromtxt('twitter_train.csv', delimiter=',', usecols=(0,1), dtype='U')