在使用genfromtxt函数中使用转换器功能失败

3
当我试图使用genfromtxt读取一个以空格分隔的文件,并使用转换器函数将逗号作为小数分隔符转换数字时,会出现类型错误。似乎我的转换器函数有问题。但是,当我在单个值上使用它时,它可以正常工作。
这是我的代码(我正在使用Matplotlib/Pylab):
t = dtype([('Date', 'U12'), ('Time', 'U10'), ('Cond', 'f4'), ('Temp', 'f4')])

conv = lambda valstr: float(valstr.replace(',','.'))

c = {2:conv, 3:conv}

data = genfromtxt('Example.csv', dtype = t,
    skip_header=1, delimiter = ' ', converters = c)

数据看起来像这样:
Date Time Cond Temp
11-10-2012 00:00:14 5,430583 29,5107
11-10-2012 00:00:15 5,431812 29,45066
11-10-2012 00:00:16 5,435501 29,43862
11-10-2012 00:00:17 5,436732 29,43862
...

以下是错误信息的一部分:


TypeError                                 Traceback (most recent call last)
<ipython-input-41-c65c2d17c55d> in <module>()
      5 c = {2:conv, 3:conv}
      6 
----> 7 data = genfromtxt('Example.csv', dtype = t, skip_header=1, delimiter = ' ', converters = c)


...


<ipython-input-41-c65c2d17c55d> in <lambda>(valstr)
      1 t = dtype([('Date', 'U12'), ('Time', 'U10'), ('Cond', 'f4'), ('Temp', 'f4')])
      2 
----> 3 conv = lambda valstr: float(valstr.replace(',','.'))
      4 
      5 c = {2:conv, 3:conv}

TypeError: expected an object with the buffer interface

我在这里做错了什么,还是genfromtxt中存在某种错误?

我正在使用Win7 x64上的Python 3.2版本。Numpy版本为1.6.2。


就此而言,你的代码在Ubuntu 12.04(64位)中使用Python 2.7.3运行良好。 - Warren Weckesser
在谷歌上搜索了一下,这种特定类型的错误似乎是在字节字符串上应用Unicode字符串函数时发生的。一个小测试证实了这一点: b'test'.replace('t','r') 会给出完全相同的错误。 看起来是Py3转换问题,这可能就是为什么我的代码在您的Py2配置上能够工作的原因。 - Puggie
1个回答

4

显然,genfromtxt将读取的列作为字节字符串而不是Unicode字符串传递给转换器函数。

对我来说,问题的解决方法是更改转换器函数的代码如下:

conv = lambda valstr: float(valstr.decode("utf-8").replace(',','.'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接