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

How do I input information from a text file to print?

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

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(),它接受一个参数,即输入文件的名称。函数 returns 创建的动物列表,如果文件不包含任何行,则为空列表。 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

我想我的问题可能出在文件的读取上,但我不太确定。

这里有几个问题:

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

  • 您正在做 print('something').format(else)。您正在 print() 对象上调用 format 方法。 print()函数returns什么都没有,所以调用format就相当于None.format(),显然是行不通的。你想在字符串上调用 format,而不是 print 函数。所以 print('something'.format(else)) 而不是 print('something').format(else)

  • 您正在 processAnimals 中使用 self.species, self.language, self.age。除非 processAnimalsAnimals 的 class 方法,我猜它不是,因为它唯一的参数是 fname,没有 self调用方法的对象。在调用方法之前,您需要为每一行实例化 Animals class。

你可以这样做:

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))