尝试使用从文件打开的数据填充数组

时间:2014-09-18 19:05:00

标签: python arrays file-io

以下是我编写的代码,它试图打开单个文件,这些文件是长条数据并将它们读入数组。基本上我有超过15次(24小时到360小时)的文件,每个文件的迭代次数为50,因此这两个循环。然后我尝试将文件打开到一个数组中。当我尝试在数组中打印特定元素时,我收到错误"' file'对象没有属性' 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脚本应该生成的CORRECT数组(抱歉它不会让我发布这个内联):

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行放在第二个位置,依此类推。我不知道为什么,或者我在代码中指定它的位置。

1 个答案:

答案 0 :(得分:3)

您将文件对象本身附加到data,而不是其内容:

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

因此,当您尝试print data[1][1]时,data[1]是一个文件对象(一个已关闭的文件对象,要启动,但如果仍然打开它就会破坏),所以{{1}尝试将该文件对象视为一个序列,并且文件对象不是序列。


目前尚不清楚您的数据格式是什么,或者您希望如何将其拆分。


如果"长条数据"只是意味着"一堆线",那么你可能想要这个:

data[1][1]

文件对象可迭代的行,它不是一个序列。您可以将任何iterable复制到具有data.append(list(fo)) 函数的序列中。现在,list将成为第二个文件中的第二行。

(" iterable""序列&#34之间的差异;对于Python的新手来说可能并不明显。Iterators上的教程部分简要解释了这一点, Glossary提供了更多的信息,collections模块中的ABC确切地定义了你可以对每种事物做什么。但简单地说:一个可迭代的东西你可以循环。有些迭代是序列和data[1][1]一样,这意味着他们可以像list一样访问可转换集合。其他人不像spam[0]那样只能一次读取一行到内存中你循环它。)


另一方面,如果您出于某种原因实际导入了file,那么您可能更想要这样的内容:

csv

现在,reader = csv.reader(fo) data.append(list(reader)) 将是第二个文件第二行的列表。


或许你只是想把它当成一系列字符:

data[1][1]

现在,data.append(fo.read()) 将成为第二个文件的第二个字符。


还有很多其他的东西你可以轻易地写出来,并且可以轻松地写出每一个......但是在你知道你想要哪一个之前,你就无法写出来。