2015-05-07 46 views
-1

我得到以下錯誤爲我的代碼:數據類型「國家」不明白。我相對較新的python,我基本上正在學習如何處理.csv文件。我使用python 3.4和編輯器Canopy。我試圖將csv的數據類型格式化爲字符串和浮點數,但只要我嘗試將字符串類型分配給第一個數據列(col由字 - 國家領導),我就會收到錯誤消息。我試圖將國家分配給相信可以是字符串的「a200」類型。我在這裏做錯了什麼?請清楚,因爲我是新的。數據類型「國家」不明白

的代碼是這樣的:

import csv 
import numpy 

def open_with_csv(filename): 

    data = [] 

    with open(filename) as csvin: 
     file_reader = csv.reader(csvin, delimiter = ',') 
     for line in file_reader: 
      data.append(line) 

    return data 

data_from_csv = open_with_csv('C:\Users\user\Desktop\MDR-TB_burden_estimates_2015-05-07.csv') 

print (data_from_csv) 

FIELDNAMES = ['country', 'iso2', 'iso3', 'iso_numeric', 'year', 'source_mdr_new', 'source_drs_coverage_new', 'source_drs_year_new', 'e_new_mdr_pcnt', 'e_new_mdr_pcnt_lo', 'e_new_mdr_pcnt_hi', 'e_new_mdr_num', 'e_new_mdr_num_lo', 'e_new_mdr_num_hi', 'source_mdr_ret', 'source_drs_coverage_ret', 'source_drs_year_ret', 'e_ret_mdr_pcnt', 'e_ret_mdr_pcnt_lo', 'e_ret_mdr_pcnt_hi', 'e_ret_mdr_num', 'e_ret_mdr_num_lo', 'e_ret_mdr_num_hi', 'e_mdr_num', 'e_mdr_num_lo', 'e_mdr_num_hi'] 


print (FIELDNAMES) 

DATATYPES = [('country','a200'), ('iso2'), ('iso3'), ('iso_numeric'), ('year'), ('source_mdr_new'), ('source_drs_coverage_new'), ('source_drs_year_new'), ('e_new_mdr_pcnt'), ('e_new_mdr_pcnt_lo'), ('e_new_mdr_pcnt_hi'), ('e_new_mdr_num'), ('e_new_mdr_num_lo'), ('e_new_mdr_num_hi'), ('source_mdr_ret'), ('source_drs_coverage_ret'), ('source_drs_year_ret'), ('e_ret_mdr_pcnt'), ('e_ret_mdr_pcnt_lo'), ('e_ret_mdr_pcnt_hi'), ('e_ret_mdr_num'), ('e_ret_mdr_num_lo'), ('e_ret_mdr_num_hi'), ('e_mdr_num'), ('e_mdr_num_lo'), ('e_mdr_num_hi')] 

def load_data(filename, d=','): 
    my_csv = numpy.genfromtxt(filename, delimiter=d, skip_header=1, invalid_raise=False, names= FIELDNAMES, dtype = DATATYPES) 
    return my_csv 

my_csv = load_data('C:\Users\user\Desktop\MDR-TB_burden_estimates_2015-05-07.csv') 
+0

你有沒有理由不使用熊貓? – jwilner

+0

對於這種問題,你的'csv'文件(即剪切並粘貼幾行)的一個小樣本很好。它使測試'genfromtxt'設置變得更容易,並嘗試替代方案。 – hpaulj

+0

你爲什麼包含'open_with_csv'代碼 - 如果它運行良好? – hpaulj

回答

2

看起來要傳遞到numpy.getfromtxt的格式不正確的參數。

如果你想傳遞一個值,以這兩個名字和D型參數,那麼你需要指定D型爲昏迷分隔的字符串:「A200,0-14,等等......」

另外,您可以通過列表元組(「名稱」,「類型」)對,不指定名稱參數。

你可以看看這裏的例子: http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html

+0

感謝您的回答。 – eni

0

我相信這將重新創建您的問題:

In [156]: txt=b"""USA, 123, ux345, 1.24 
Canada, 434, xz3444, 3.34 
France, 443, 2x453, 4.34 
"""  
In [157]: FIELDNAMES=['country','id','code','value'] 
In [158]: DATATYPES =[('country','a100'),('id'),('code'),('value')] 
In [159]: np.genfromtxt(txt.splitlines(), delimiter=',',dtype=DATATYPES, names=FIELDNAMES) 

... 
--> 847   ndtype = np.dtype(dict(formats=ndtype, names=names)) 
    848  else: 
    849   nbtypes = len(ndtype) 

TypeError: data type "country" not understood 

所以這就是你的主題行的來源。出於某種原因,在解析DATATYPES時,它認爲'country'表示dtype(與'S100','int'等同)。但你的意思是它是一個字段名稱。

讓我們正確DATATYPES,併爲每個字段提供一個類型,而不僅僅是第一:

In [165]: DATATYPES =[('country','a100'),('id',int),('code','a5'),('value',float)] 

In [166]: np.genfromtxt(txt.splitlines(), delimiter=',',dtype=DATATYPES, names=FIELDNAMES) 
Out[166]: 
array([(b'USA', 123, b' ux34', 1.24), (b'Canada', 434, b' xz34', 3.34), 
     (b'France', 443, b' 2x45', 4.34)], 
     dtype=[('country', 'S100'), ('id', '<i4'), ('code', 'S5'), ('value', '<f8')]) 

由於Serguei寫道,有指定的名稱和dtypes的幾種方法。所以是的,重讀genfromtxt文件,如果這不明確。 SO上還有很多關於SO的問題和例子。

+0

感謝您的回答 – eni