如何输入文本文件中的信息进行打印?

时间:2015-01-16 21:19:31

标签: python python-3.x file-io

我必须制作一个允许用户输入信息并根据该信息打印出一些文本的动物类。

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

我认为我的问题可能是阅读文件,但我并不确定。

1 个答案:

答案 0 :(得分:1)

这里有一些问题:

  • 您正在使用fname迭代打开的文件for line in f。然后,您立即执行line = fname.strip().split(','),根据line - 文件名重新定义fname。您想要分割line,而不是fname

  • 你正在做print('something').format(else)。您正在format对象上调用print()方法。 print()函数不返回任何内容,因此调用format等同于None.format(),这显然无效。您想在字符串上调用format,而不是print函数。所以print('something'.format(else))而不是print('something').format(else)

  • 您在self.species, self.language, self.age内使用processAnimals。除非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))