2015-01-16 116 views
0

我不得不製作一個動物課,讓用戶可以根據這些信息輸入信息並打印出一些文字。如何從文本文件輸入信息進行打印?

class Animal: 
    def __init__(self,species='default',language='default',age=0): 
     self.species=species 
     self.language=language 
     self.age=age 
    def setSpecies(self, species): 
     #set animal species 
     self.species=species 
    def setLanguage(self, language): 
     #set animal language 
     self.language=language  
    def setAge(self, age): 
     #set animal age 
     self.age=age  
    def speak(self): 
     #prints a sentance by the animal 
     print('I am a {} year old {} and I {}.'.format(self.age, self.species, self.language)) 
    def __repr__(self): 
     #return string representation 
     return "Animal,'{}','{}',{}".format(self.species,self.language,self.age) 
    def __eq__(self, new): 
     #compares animals 
     return self.species==new.species and self.language==new.language and self.age==new.age 

現在我必須寫一個函數processAnimals(),它有一個參數,輸入文件名。如果文件不包含任何行,該函數將返回創建的動物列表或空列表。 processAnimals()函數應讀取文件中的所有行,爲每行創建一個Animal對象並將該對象放入列表中。

def processAnimals(fname): 
    with open(fname,'r') as f: 
     for line in f: 
      line = fname.strip().split(',')   
      print('I am a {} year old {} and i {}.').format(self.species,self.language,self.age) 

我得到這個錯誤:AttributeError: 'NoneType' object has no attribute 'format'

當我刪除.format(self.species,self.language,self.age)它打印

I am a {} year old {} and i {}. 

I am a {} year old {} and i {}. 

I am a {} year old {} and i {}. 

這是我需要的,但{}應該從文件

文本文件中有信息:

cat,meow,8 
dog,bark,22 
bat,use sonar,2 

我認爲我的問題可能是文件的閱讀,但我不確定。

+0

首先必須創建類動物的情況下,那麼只有你可以使用該對象的方法。 – ZdaR

回答

1

這裏有幾個問題:

  • 您與for line in f遍歷打開的文件fname。然後您立即做line = fname.strip().split(','),根據fname重新定義line - 文件的名稱。你想拆分line,而不是fname

  • 你在做print('something').format(else)。您在print()對象上調用format方法。 print()函數什麼都不返回,所以調用format就等於None.format(),這顯然不起作用。你想要在字符串上調用format,而不是print函數。所以print('something'.format(else))而不是print('something').format(else)

  • 您在processAnimals的內部使用self.species, self.language, self.age。除非processAnimalsAnimals的類方法,並且我猜測它不是因爲它的唯一參數是fname,所以沒有self對象調用方法。在調用方法之前,您需要爲每行實例化Animals類。

你可以這樣做:

def processAnimals(fname): 
    with open(fname, 'r') as f: 
     for line in f: 
      new_animal = Animal(*(line.strip().split(','))) 
      print('I am a {} year old {} and i {}.'.format(new_animal.species, new_animal.language, new_animal.age)) 
+0

這讓我非常克塞爾謝謝你。現在它正在打印我是一個默認的默認值,我是0。我仍然需要它將txt文件信息放入 – iggyami

+0

非常感謝您現在的工作,並且我明白我錯誤的地方,這要感謝您的精彩解釋。 – iggyami

相關問題