2014-09-18 47 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