我正在写一个python程序,我有3个文件。一个是主文件,一个是类文件,一个是数据文件。数据文件从2个文本文件中读取,并拆分和排列数据以供类和主文件使用。无论如何,我已经完成了数据和主文件,但我遇到了类文件的问题。它是一般的字符串格式问题,但我无法理解我可以做些什么来修复它。我收到了错误
“文件”/ Users / admin / Desktop / Program 6 / FINAL / classFile.py“,第83行, 在 repr if len(self._birthDay [0])< 2:TypeError:'int'类型的对象没有len()
答案 0 :(得分:2)
使用string formatting,而不是字符串连接,它是很多更清洁:
return "{} {} (# {} ) GPA {:0.2f}".format(
self._first, self._last, self._techID, self.currentGPA()
)
如果你使用这种格式,它会为你自动转换类型
答案 1 :(得分:0)
在我看来,birthDay
是一个整数列表,而不是一个字符串列表。
如果你想确保它们都是字符串,你可以尝试:
self._birthDay = list(map(str, birthDay))
或者,如果您知道他们都是字符串,您可以首先使用字符串格式来避免这些len
检查:
self._birthDay = ['{:02d}'.format(x) for x in birthDay]
但更好的方法是将birthDay
表示为datetime.datetime
个对象。假设它总是以3个整数,月,日,年的形式出现,你可以这样做:
bmon, bday, byear = birthDay
self._birthDay = datetime.datetime(byear, bmon, bday)
然后,您的__repr__
可以使用datetime.strftime
方法。
修改强>
为了响应您的更新,我认为您应该将from datetime import datetime
添加到getData
的顶部,然后使用以下方法,而不是解析月/日/年:
birthDay = datetime.strptime(x[3], '%m/%d/%Y')
这将为您提供一个完整的datetime
对象来表示生日(或者,您可以使用datetime.date
对象,因为您不需要时间。)
然后,您可以将__repr__
方法替换为:
def __repr__(self):
fmtstr = '{first} {last} (#{techid})\nAge: {age} ({bday})\nGPA: {gpa:0.2f} ({credits})'
bday = self._birthDay.strftime('%m/%d/%Y')
return fmtstr.format(first=self._first,
last=self._last,
age=self.currentAge(),
bday=bday,
gpa=self.currentGPA(),
credits=self._totalCredits)
哦,由于_birthDay
现在是datetime.datetime
,因此您需要更新currentAge()
以返回int((datetime.datetime.now() - self._birthDay) / datetime.timedelta(days=365))
这样会相当准确而不会太复杂。
答案 2 :(得分:0)
正如错误消息所述,len
对int没有意义。如果您想要其中的字符数,请先将其转换为str。
def __repr__(self):
if len(str(self._birthDay[0]))<2:
self._birthDay[0] = "0" + str(self._birthDay[0])
elif len(str(self._birthDay[1]))<2:
self._birthDay[1] = "0" + str(self._birthDay[1])
return self._first + " " + self._last + " (#" + self._techID + ")\nAge: " + str(self.currentAge()) + \
" (" + str(self._birthDay[0]) + "/" + str(self._birthDay[1]) + "/" + str(self._birthDay[2]) + ")" + \
"\nGPA: %0.2f" % (self.currentGPA()) + " (" + str(self._totalCredits) + " Credits" + ")\n"