Python3中的numpy genfromtxt问题

时间:2013-05-16 07:08:48

标签: python numpy python-3.x genfromtxt

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

1,a
2,b
3,c

使用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读取文件的方式不同,这在某种程度上expected。因此我使用转换器来解码字符串:

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'],已按预期解码。

我还尝试按照this link的建议,将文件作为open的{​​{1}}模式输出,但没有任何改进。

为什么转换器仅在读取一列时工作,而不是在读取两列时?你能否建议我在Python3中使用'rb'的正确方法?难道我做错了什么?提前谢谢!

3 个答案:

答案 0 :(得分:8)

我的问题的答案是使用dtype作为unicode字符串(例如U2)。

感谢E.Kehler的回答,我找到了解决方案。 如果我在str定义中使用S8代替dtype,那么第二列的输出为空:

numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,str')

输出是:

array([(1.0, ''), (2.0, ''), (3.0, '')], dtype=[('f0', '<f16'), ('f1', '<U0')])

这表明我纠正dtype来解决我的问题是一个unicode字符串:

numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,U2')

给出了预期的输出:

array([(1.0, 'a'), (2.0, 'b'), (3.0, 'c')], dtype=[('f0', '<f16'), ('f1', '<U2')])

有用的信息也可以在the numpy datatype doc page找到。

答案 1 :(得分:1)

在python 3中,编写

  

D型= “S8”

NumPy的genfromtxt中的

(或“S#”的任何变体)产生一个字节串。要避免这种情况并获得一个旧式字符串,请写

  

D型= STR

代替。

答案 2 :(得分:0)

training = np.genfromtxt('twitter_train.csv', delimiter=',', usecols=(0,1), dtype='U')

在我的情况下,第一列包含的情感值是0或1,第二列是一个由许多字符组成的字符串,表示该ex中的一条推文。 dtype ='U'从其中包含了b'。

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