Python中类文件中的int和string错误

时间:2016-03-31 20:49:08

标签: python string class python-3.x methods

我正在写一个python程序,我有3个文件。一个是主文件,一个是类文件,一个是数据文件。数据文件从2个文本文件中读取,并拆分和排列数据以供类和主文件使用。无论如何,我已经完成了数据和主文件,但我遇到了类文件的问题。它是一般的字符串格式问题,但我无法理解我可以做些什么来修复它。我收到了错误

  

“文件”/ Users / admin / Desktop / Program 6 / FINAL / classFile.py“,第83行,   在 repr       if len(self._birthDay [0])< 2:TypeError:'int'类型的对象没有len()

3 个答案:

答案 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"