2012-02-20 61 views
2

我正在从IDL转换为Python和numpy(有点像Matlab)。这是一个关于处理数据的悬而未决的问题。也许有人可以帮忙。最佳数据结构:字典数组,对象数组?

我的数据通常情况是,我有一个固定的数据类,可能来自电子表格,数据库等。我试图弄清楚什么样的数据结构最好在Python和numpy中使用。

我知道csv模块,可以使用csv.DictReader()来读取电子表格。它逐行读取并使用电子表格标题中的专有名称(第一行)制作字典。

f=open(file,'rU') 
dat = csv.DictReader(f) 
i=0 
data=[] # makes an empty list 
i=0 
for row in dat: 
    data.append(row) 
    if i == 0 : 
     keys=row.keys() 
     print "keys" 
     print keys 
     print 
    i=i+1 

f.close() 

首先,这是有点儿大量的代码读取一个CSV文件导入词典和关键字的关键字的列表。有更快/更好的方法吗?

但现在,我想知道一个字典数组是否真的是我想要的。我应该制作一组对象并将其作为一组对象吗?或者是其他东西?

如果我有我的字典阵,“数据”,我会得到一些“列”像 年龄=([数据DAT [“时代”对于DAT])阵列

那是正确的如何做到这一点?有没有办法像“年龄=数据 - >年龄”这样做会更快?

希望能得到一些指导。谢谢。

+0

你有一个词典列表,而不是一个字典数组。好像你想要一个普通的旧数组或可能是一个recarray。看看numpy.loadtxt或csv.reader。 – 2012-02-21 02:15:42

回答

0

的阵列做这你就OK了,虽然你的代码可以很容易变得更简洁的方式去:

data = list(csv.DictReader(open(file, 'rU'))) 
print "keys", data[0].keys() 
+0

好的。凉。但是,我需要关闭文件,或者如果没有文件句柄的话,它会自动关闭吗? – Dave31415 2012-02-20 18:29:37

+1

@ Dave31415:总是使用这个:'打开(file,'rU')作为the_file:'。缩进你的'dat = csv.DictReader(the_file)'和''with'里面的所有内容,并保证文件将被关闭。 – 2012-02-20 18:34:47

+1

一旦打开的行被执行,John Z的方法也会关闭该文件。更一般的情况是,当没有更多的文件对象引用时(或者在with块的末尾或者调用f.close()时)文件会关闭。 – 2012-02-21 02:06:09

0

我总是对象

+0

有没有一种快速的方法来自动生成一个csv文件的类,或者你必须通过编写代码手动构建它? – Dave31415 2012-02-20 18:50:42

+0

您是否已经签出:http://docs.python.org/library/csv.html – 2012-02-20 18:54:29

5

如果您正在使用电子表格型工作数据很多,我强烈建议使用pandas,这是一个为这类事情设计的Python包。你只是做:

pandas.read_csv(file) 

这就给了你一个DataFrame,这的确各种花哨的索引,并且是很好,速度很快。

+0

这是否与numpy很好地相互作用,或者它应该是另一种选择? – Dave31415 2012-02-20 18:49:04

+1

它建立在numpy之上,所以它们在一起工作得非常好。 – 2012-02-20 20:49:31

2

看到如何你明确提到使用numpy的,可以考虑类似如下:

import numpy as np 
data = np.genfromtxt('data.txt', delimiter=',', names=True) 
print data['item1'] 

或者

import numpy as np 
item1, item2, item3 = np.loadtxt('data.txt', delimiter=',', skiprows=1).T 

data.txt格式是东西沿着这些路线(即逗号分隔)。

item1, item2, item3 
1.0, 2.0, 3.0 
4.0, 5.0, 6.0 
7.0, 8.0, 9.0 

第一个例子使用结构化阵列,而第二个是只拆包列(从而移调(.T))分成三个变量。