我必须找到一种方法来获取已经给出的代码并通过使其成为面向对象的类来改进它。
此代码:已经提供,我们将其用于新代码。文件'students2txt'是逐行提取的(基于':'拆分),StudentFileReader
类被导入新的class StudentReport(object)
。因此,完成的项目应该给出一个学生列表,其中包含ID号,名字和姓氏,gpa(所有信息都在'students2.txt'中提供,我只需要让代码打印所有信息。
filereader.py
:
class StudentFileReader:
def __init__(self, inputSrc):
self._inputSrc = inputSrc
self._inputFile = None
def open(self):
self._inputFile = open(self._inputSrc, 'r')
def close(self):
self._inputFile.close()
self._inputFile = None
def fetchRecord(self):
line = self._inputFile.readline()
if line == "":
return None
record = StudentRecord()
#change
record.idNum = int(line)
record.firstName = self._inputFile.readline().rstrip().rsplit(':')
record.lastName = self._inputFile.readline().rstrip().rsplit(':')
record.classCode = int(self._inputFile.readline())
record.gpa = float(self._inputFile.readline())
return record
class StudentRecord:
def __init__(self):
self.idNum = 0
self.firstName = ""
self.lastName = ""
self.classCode = 0
self.gpa = 0.0
新文件:
from filereader import StudentFileReader
class StudentReport(object):
def __init__(self):
self._theList = None
def loadRecords(self, filename):
self.reader = StudentFileReader(filename)
self.reader.open()
theList = []
record = self.reader.fetchRecord()
while record is not None:
theList.append(record)
record = self.reader.fetchRecord()
reader.close()
return theList
def sortByid(self):
self._studentList.sort(key = lambda rec: rec.idNum)
def sortByName(self):
pass
def __str__(self):
classNames = [ "", "Freshman", "Sophomore", "Junior", "Senior" ]
print( "LIST OF STUDENTS".center(50) )
print( "" )
print( "%-5s %-25s %-10s %-4s" % ('ID', 'NAME', 'CLASS', 'GPA'))
print( "%5s %25s %10s %4s" % ('-' * 5, '-' * 25, '-' * 10, '-' * 4))
# Print the body.
for record in theList :
print( "%5d %-25s %-10s %4.2f" % \
(record.idNum, \
record.lastName + ', ' + record.firstName,
classNames[record.classCode], record.gpa) )
# Add a footer.
print( "-" * 50 )
print( "Number of students:", len(theList) )
if __name__ == "__main__":
s = StudentReport()
s.loadRecords('students2.txt')
s.sortByName()
print str(s)
此代码取自教科书Data Structures and Algorithms Using Python。我应该做一个面向对象的类。我已经开始StudentRecord
课并编写了__init__
,但我不确定在那之后该怎么做。当我尝试运行任何东西时,它会给我invalid literal for int() with base 10
错误。我对python很新,所以我不确定如何轻松地使任何类对象...
编辑:是的,错误来自fetchRecord函数
Traceback (most recent call last):
File "C:\Users\...\studentreport.py", line 24, in <module>
s.loadRecords('students2.txt')
File "C:\Users\...\studentreport.py", line 13, in loadRecords
record = self.reader.fetchRecord()
File "C:\Users\...\filereader.py", line 22, in fetchRecord
record.idNum = int(line)
ValueError: invalid literal for int() with base 10: '10015:John:Smith:2:3.01\n'
答案 0 :(得分:3)
您的行解析代码与文件格式不匹配。
您正在尝试将整行解释为整数,但该行包含更多。
也许你想先拆线?该行包含记录的所有元素:
parts = line.strip().split(':')
record.idNum = int(parts[0])
record.firstName = parts[1]
record.lastName = parts[2]
record.classCode = parts[3]
record.gpa = float(parts[4])
您可以通过在自己的代码中继承类来覆盖原始StudentFileReader.fetchRecord())
方法:
class MyStudentFileReader(StudentFileReader):
def fetchRecord(self):
line = self._inputFile.readline()
if not line:
return None
record = StudentRecord()
parts = line.strip().split(':')
record.idNum = int(parts[0])
record.firstName = parts[1]
record.lastName = parts[2]
record.classCode = parts[3]
record.gpa = float(parts[4])
return record
然后使用MyStudentFileReader()
代替StudentFileReader()
。
答案 1 :(得分:1)
在开始尝试将各个部分转换为各个数据项所需的格式之前,您需要拆分行。现在,您正在反复调用readline
,因此您为学生计算的每个值都来自文件的单独一行。
相反,尝试将结果直接拆分并解压缩到局部变量中:
idNum, firstName, lastName, classCode, GPA = line.rstrip().split(':')
然后执行每个需要的转换(例如record.idNum = int(idNum)
)。