2014-09-18 28 views
0

下面打开的数据数组是代码我写了试图打开个人文件,它们是数据的长条并将其读入的阵列。基本上我有15次运行(24小时到360小时)的文件,每个文件有50次迭代,因此是两个循环。然后我尝试打开文件到一个数组中。当我尝试打印数组中的特定元素时,出现错误“文件”对象没有属性'getitem''。任何想法是什么问题?谢谢。试图填补与来自文件

#!/usr/bin/python 
############################################ 
# 
import csv 
import sys 
import numpy as np 
import scipy as sp 
# 
############################################# 

level = input("Enter a level: "); 
LEVEL = str(level); 
MODEL = raw_input("Enter a model: "); 
NX = 360; 
NY = 181; 
date = 201409060000; 
DATE = str(date); 
############################################# 

FileList = []; 
data = []; 

for j in range(1,51,1): 
    J = str(j); 
    for i in range(24,384,24): 
      I = str(i); 
      fileName = '/Users/alexg/ECMWF_DATA/DAT_FILES/'+MODEL+'_'+LEVEL+'_v_'+J+'_FT0'+I+'_'+DATE+'.dat'; 
      FileList.append(fileName); 
      fo = open(fileName,"rb"); 
      data.append(fo); 
      fo.close(); 
print data[1][1]; 

print FileList;

编辑补充: 下面,找到正确的数组的Python脚本应当以生产(抱歉,它不会让我张贴这种内嵌还):

http://i.stack.imgur.com/ItSxd.png

我现在碰到的问题,的是,所述输出矩阵的第一行中的前三个值是:

-7.090874  

-7.004936  

-6.920952 

这些值实际上是第11行下面的阵列中,这是它应该如何看(在执行的前三个值MATLAB)。 python脚本输出的下三个值(如它认为是第二行)是:

-5.255577  

-5.159874  

-5.064171 

这些值应该在第22行中找到。换句话说,python将第11行的值放在第一位,第22位放在第二位,依此类推。我不知道为什么,或者在我指定的代码中执行此操作。

+2

请阅读此:http://legacy.python.org/dev/peps/pep-0008/ – jonrsharpe 2014-09-18 19:10:50

+0

特别是:不要在每行的末尾放分号;不要随意混合不同的变量命名风格,而是一致而不是随意地缩进,并使用'with'语句而不是'close'。正如所写的,对于任何使用Python的人来说,这看起来都不像Python,这会减慢任何试图阅读并帮助你的人。 – abarnert 2014-09-18 19:17:24

+0

不知道你正在使用什么代码,我们不能调试代码的错误。而且,由于它显然不是原始问题中的代码,因此您应该将此作为新问题发布,而不是编辑此问题。在你的新问题中,给我们一个完整的MCVE,带有(精简)可运行的源代码和输入(在文本中,不是截图),所以如果有人想直接调试它,而不是试图从第一原则推理他们可以(这通常是获得答案的更快方式)。 – abarnert 2014-09-19 17:41:35

回答

3

要追加的文件对象自己data,而不是它们的内容:

fo = open(fileName,"rb"); 
data.append(fo); 

所以,当你尝试print data[1][1],是一个文件对象(一个封闭的文件对象,引导,但它如果仍然打开,将会被破坏),因此data[1][1]会尝试将该文件对象视为序列,并且文件对象不是序列。


目前尚不清楚您的数据格式是什么,或者您想如何拆分它。


如果“长数据的数据带”只是意味着“一帮行”,那么你可能想要这个:

data.append(list(fo)) 

一个文件对象线的迭代,它只是不一个序列。您可以使用list函数将任何迭代代码复制到一个序列中。所以现在,data[1][1]将成为第二个文件中的第二行。

(之间的差别“迭代”和“序列”可能是不明显的新人到Python。在Iterators教程部分解释它简单地说,Glossary给出了一些详细信息,以及collections模块中的基本知识定义正是你可以用各种东西,但做简要:。可迭代的是什么,你也可以遍历一些iterables的序列,像list,这意味着它们可以访问诸如spam[0]可转位的集合。其他人则没有,像file,刚刚超过它读取一行在同一时间到内存中,你循环。)


如果,另一方面,你实际进口csv是有原因的,你更有可能想要是这样的:现在

reader = csv.reader(fo) 
data.append(list(reader)) 

data[1][1]将是第二个文件的第二行的列的列表。


或者,也许你只是想将其作为一个字符序列:

data.append(fo.read()) 

现在,data[1][1]将是第二档的第二个字符。


有很多其他的东西,你可以很容易的意思,和简单的方式来写他们每个人......但直到你知道你想要哪一个,你不能写它。

+0

工作,谢谢。我会小心改变格式。你可以说,我对此很新。但是一个新问题出现了,数据被正确地附加了,除了数组在第一行数据的第11次迭代而不是第一次迭代之后附加数据。我知道这个问题是因为数据被索引为... 1-9 ...而不是... 01-09。有没有办法来解决这个问题? – agold2121 2014-09-18 21:20:07

+0

@ agold2121:我不明白你的意思是“01-09”是数字为“1-9”还是非法的八进制数字。也许你没有意识到Python中的索引从0开始,所以第一行是'data [0]',第二行是'data [1]'等等。 – abarnert 2014-09-18 21:41:29

+0

经过进一步检查,数组在第一行中存储文件名的第11次迭代,第二行中第22次,第三次中第33次,依此类推。在我的代码中,我告诉它要这么做? – agold2121 2014-09-18 21:45:34