我有一个类似于此的文本文件,其中第一列是学生的名字,第二列是学分数,第三列是分数(分数小时)。
john 5 15
bill 9 30
ted 7 22
我想创建一个提取相关信息并计算gpa的类。
class Student:
def __init__(self, name, hours, qpoints):
self.name = name
self.hours = float(hours)
self.qpoints = float(qpoints)
def getName(self):
return self.name
def getHours(self):
return self.hours
def getQPoints(self):
return self.qpoints
def gps(self):
return self.qpoints/self.hours
用于提取数据(基于每条信息之间有标签的事实)
def makeStudent(info):
name, hours, qpoints = info.split("\t")
return Student(name, hours, qpoints)
这里我使用for循环通过将每行的相关信息附加到列表中来基于文本文件中的数据创建列表
def readStudents(filename):
infile = open(filename, 'r')
students = []
for line in infile:
students.append(makeStudent(line))
infile.close()
return students
问题是我收到了这个错误:
[<__main__.Student object at 0x01FA4AD0>, <__main__.Student object at 0x01FA4AF0>,
<__main__.Student object at 0x01FA4B10>, <__main__.Student object at 0x01FA4B50>,
<__main__.Student object at 0x01FA4B30>]
关于为什么会发生这种情况的任何想法?
答案 0 :(得分:4)
这不是错误。这是常规输出。您应该覆盖Student
类的__str__
和__repr__
方法,告诉python如何打印Student
个对象。
对您的代码提供一些帮助,这要好得多:
def readStudents(filename):
with open(filename) as student_file:
return [Student(*line.split()) for line in student_file]
答案 1 :(得分:2)
像所有人说的那样,不是错误。只需在__str__
课程上实施__repr__
,__unicode__
或Student
。
但是,我有一个小建议。您应该使用csv module来阅读您的文件。
您的readStudents
函数也可以像这样重写:
def readStudents(filename):
students = []
with open(filename) as infile:
for line in csv.reader(infile, delimiter='\t'): # or excel-tab if you want.
students.append(Student(**line))
return students
不是很漂亮吗?
不要忘记在python文件的开头添加import csv
!
答案 2 :(得分:0)
您不会收到错误,而是收到学生对象列表。您需要做的是实施__str__
或__repr__
方法:Special method names
答案 3 :(得分:0)
我强烈建议您使用csv module(import csv
):它将为您完成大部分工作,更灵活,更易读,更不容易出错。
另外,要更严格一点:你的实际问题是什么?我只看到一些代码和一些你不明白的输出。顺便说一下,这不是错误消息,它是Student类的五个实例的列表。代码似乎按预期工作:您解析文件,创建学生,然后..?你想和他们做什么?解析完成后,您希望继续处理数据。
答案 4 :(得分:0)
Getter和setter方法通常不赞成,除非他们正在做一些活动的事情(除了检索或设置一个值之外)。
import csv
class Student(object):
def __init__(self, name, hours, qpoints):
super(Student,self).__init__()
self.name = str(name)
self.hours = float(hours)
self.qpoints = float(qpoints)
@property
def gpa(self):
return self.qpoints/self.hours
@gpa.setter
def gpa(self, value):
raise SyntaxError('gpa property is read-only; update .qpoints or .hours instead')
def __str__(self):
return "{name:20} {hours:>6.2f} {qpoints:>6.2f} {gpa:>6.2f}".format(name=self.name, hours=self.hours, qpoints=self.qpoints, gpa=self.gpa)
def loadStudents(fname, *args, **kwargs):
with open(fname) as inf:
return [Student(*line) for line in csv.reader(inf, *args, **kwargs)]
def main():
students = loadStudents('students.csv', delimiter='\t')
for s in students:
print s
if __name__=="__main__":
main()
结果
john 5.00 15.00 3.00
bill 9.00 30.00 3.33
ted 7.00 22.00 3.14