2013-04-22 4 views
1

Этот код является попыткой начать чтение файла csv в несколько списков. Я получаю ошибку ниже, и я не понимаю, почему float не возвращается. Спасибо за вашу помощь!ТипError: объект 'float' не имеет атрибута '__getitem__'

File "main.py", line 32, in <module> 
    LR.openfile('djia_temp.csv') 
File "main.py", line 9, in openfile 
    self.xs = self.tempDiff(dataAvgandtemp) 
File "main.py", line 18, in tempDiff 
    tdArray.append([vector[0]-vector[1]]) 
TypeError: 'float' object has no attribute '__getitem__' 

Код:

from processFile import processFile 
import numpy as np 

class processFile: 

    @staticmethod 
    def wholeFile(f): 
     fileArray = [] 
     for line in f: 
      fileArray.append(line.strip()) 
     return fileArray 

    @staticmethod 
    def liner(rows, columns, delimiter): 
     vectors = [] 
     for row in rows: 
      vector = [] 
      tok = row.split(delimiter) 
      for num in columns: 
       vectors.append(float(tok[num])) 
     return vectors 

class linRegmain: 
    def openfile(self, file): 
     f = open(file) 
     a = processFile.wholeFile(f)[1:] 
     dataAvgandtemp = processFile.liner(a, [2,3], ";") 
     self.xs = self.tempDiff(dataAvgandtemp) 
     self.ys = processFile.liner(a,[1], ";") 
     print self.xs 
     print self.ys 


    def tempDiff(self, vectors): 
     tdArray = [] 
     for vector in vectors: 
      tdArray.append([vector[0]-vector[1]]) 
     return tdArray 

if __name__ == '__main__': 
    LR = linRegmain() 
    LR.openfile('djia_temp.csv') 
+3

В качестве примечания, вы осведомлены о 'csv' модуля в стандартной библиотеке Python? Поскольку вы импортируете 'numpy', возможно, вы можете напрямую использовать' np.loadtxt' или 'np.genfromtxt'. Или используйте действительно быстрый загрузчик csv от 'pandas'. – jorgeca

+0

круто, я не знал, что numpy может разбираться так красиво. я попробую. – zeemy23

ответ

3

liner() требования вернуть список векторов. Это не. Вы делаете список float с:

vectors.append(float(tok[num])) 

Таким образом, при вызове tempDiff() с результатом, vector является float, так vector[0] вызывает исключение.

Я думаю, что это то, что он должен делать: добавить каждый поплавок текущего вектора, а затем добавить вектор к результату:

@staticmethod 
def liner(rows, columns, delimiter): 
    vectors = [] 
    for row in rows: 
     vector = [] 
     tok = row.split(delimiter) 
     for num in columns: 
      vector.append(float(tok[num])) # append to vector, not vectors 
     vectors.append(vector)    # then append the vector to the result 
    return vectors 
+0

Спасибо за ваш ответ! извините, это были сильно названные переменные. эта программа не имеет векторного класса. если я изменяю переменные как таковые: http://pastebin.com/MsJEbs65, я все равно получаю ту же ошибку – zeemy23

+1

@ zeemy23: См. мое редактирование. Вы должны добавить каждый float в текущую строку, а затем добавить строку 'line' в' lines'. – hammar

+0

Святое дерьмо, я глуп. Большое спасибо за вашу помощь, сэр! – zeemy23

Смежные вопросы