2012-10-12 14 views
3

當我嘗試使用genfromtxt讀取空格分隔的文件並使用轉換器函數將逗號轉換爲小數點分隔符時,出現類型錯誤。看起來我的轉換器功能有問題。但是,當我在單個值上使用它時,它確實正常工作。在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。

+0

FWIW,你的代碼工作正常使用Python 2.7.3在Ubuntu 12.04(64位)。 –

+0

谷歌搜索了一下之後,這個特定類型的錯誤似乎發生在一個字節字符串上應用unicode字符串函數時。一個小測試證實了這一點: b'test'.replace('t','r') 給出了完全相同的錯誤。 似乎是一個Py3轉換的問題,這可能是爲什麼我的代碼正在你的Py2配置。 – Puggie

回答

4

顯然,genfromtxt以列字符串的形式將字符串轉換爲轉換函數,而不是unicode字符串。

問題通過改變轉換函數的代碼如下解決了我:

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