4

我正在尝试使用genfromtxtPython3 来读取包含字符串和数字的简单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 读取文件的方式不同,这在某种程度上是意料之中的。因此我使用转换器来解码字符串:

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

我还尝试按照此链接的建议将文件作为模式的输出open提供,但没有任何改进。'rb'

为什么转换器在只读取一列时工作,而不是在读取两列时工作?您能否建议我genfromtxt在 Python3 中使用的正确方法?难道我做错了什么?先感谢您!

4

3 回答 3

8

我的问题的答案是使用dtypeunicode 字符串(U2例如)。

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

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

有用的信息也可以在numpy 数据类型文档页面中找到。

于 2013-07-12T00:54:37.987 回答
1

在 python 3 中,编写

dtype="S8"

NumPy 的 genfromtxt (或“S#”的任何变体)产生一个字节字符串。为了避免这种情况并得到一个老式的字符串,写

dtype=str

反而。

于 2013-07-11T06:08:20.990 回答
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')

于 2019-04-28T09:49:57.333 回答