2016-03-31 8 views
0

Ich schreibe ein Python-Programm, wo ich 3 Dateien habe. Eine ist die Hauptdatei, eine ist die Klassendatei und eine ist eine Datendatei. Die Datendatei liest aus 2 Textdateien und teilt und ordnet die Daten zur Verwendung durch die Klassen- und Hauptdatei an. Wie auch immer, ich bin ziemlich fertig mit den Daten und den Hauptdateien, aber ich habe Probleme mit der Klassendatei. Es ist ein allgemeines String Formatierungsproblem, aber ich verstehe nicht, was ich tun kann, um es zu beheben. Ich erhalte die Fehlerint und Zeichenfolge Fehler in der Klassendatei in Python

" File "/Users/admin/Desktop/Program 6/FINAL/classFile.py", line 83, in repr if len(self._birthDay[0])<2: TypeError: object of type 'int' has no len()

+0

Ist 'self._birthDay' ein String? und wann bekommst du diesen Fehler? –

+1

Sie sollten wahrscheinlich vermeiden, das Objekt in einer '__repr__'-Methode zu ändern, außer etwas Cache oder etwas zu aktualisieren. – Paul

+0

Ich habe meine Haupt- und Datendateien für mehr Klarheit aktualisiert und hinzugefügt. –

Antwort

0

Es scheint mir, wie birthDay eine Liste von ints ist, nicht eine Liste von Strings.

Wenn Sie sicherstellen möchten, sie alle Strings sind, können Sie versuchen:

self._birthDay = list(map(str, birthDay)) 

Alternativ, wenn Sie wissen , dass sie alle Saiten sind, können Sie String-Formatierung in erster Linie nutzen, um vermeiden diese len Kontrollen:

self._birthDay = ['{:02d}'.format(x) for x in birthDay] 

Noch besser, aber birthDay als datetime.datetime Objekt darzustellen wäre. Unter der Annahme, es kommt in immer als 3 Ints, Monat, Tag, Jahr, dann würden Sie tun:

bmon, bday, byear = birthDay 
self._birthDay = datetime.datetime(byear, bmon, bday) 

Dann wird Ihre __repr__ kann das datetime.strftime Verfahren machen.

bearbeiten

Als Reaktion auf das Update, ich glaube, Sie from datetime import datetime an die Spitze der getData, dann statt Parsen aus dem Monat/Tag/Jahr, die Verwendung sollten hinzufügen:

birthDay = datetime.strptime(x[3], '%m/%d/%Y') 

Dadurch erhalten Sie ein vollwertiges datetime Objekt zur Darstellung des Geburtsdatums (alternativ können Sie ein datetime.date Objekt verwenden, da Sie die Zeit nicht benötigen).

Dann können Sie Ihre __repr__ Methode ersetzen mit:

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) 

Oh, und da _birthDay ist nun ein datetime.datetime, müssen Sie currentAge() aktualisieren int((datetime.datetime.now() - self._birthDay)/datetime.timedelta(days=365)) zurückzuversetzen maßen genau sein wird, ohne zu kompliziert zu sein.

+0

Entschuldigung. Ich habe jetzt die Haupt- und die Datendatei für mehr Klarheit hinzugefügt. –

+0

@JakeMeyer Meine Antwort wurde aktualisiert. – Paul

+0

Danke, aber wenn ich diese Methode verwende, wie aktualisiere ich die if else-Anweisungen in der Def-Methode currentAge (self)? Wenn myMonth <= Monat und myDay <= Tag: Rückkehr Jahr - myYear # Wenn nicht, ist es ein Jahr weniger als das aktuelle geschätzte Alter. sonst: return year - myYear - 1 –

2

Verwenden string formatting, nicht String-Verkettung, dann ist es viele Reiniger:

return "{} {} (# {}) GPA {:0.2f}".format(
    self._first, self._last, self._techID, self.currentGPA() 
) 

Plus, wenn Sie dieses Format verwenden, es wird die Art für Sie

+0

Wie soll ich dann die if elif Statements schreiben? –

+0

Sie könnten '' 3'.zfill (2) ' –

+0

Ich habe gerade festgestellt, dass Ihr Geburtstag manchmal eine Nummer ist. ''{! s: 0> 2}'. format (3)' Probieren Sie die Größe aus. –

0

Da die Fehlermeldung besagt, Auto-konvertieren, len macht keinen Sinn mit einem int. Wenn Sie die Anzahl der Zeichen darin ändern möchten, konvertieren Sie es zuerst in eine Zeichenfolge.

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" 
+0

Entschuldigung. Ich habe jetzt die Haupt- und die Datendatei für mehr Klarheit hinzugefügt. –

+0

Und es gibt mir den Fehler Datei "/ Benutzer/Admin/Desktop/Programm 6/FINAL/classFile.py", Zeile 84, in __repr__ self._birthDay [0] = "0" + str (selbst. _birthDay [0]) TypeError: Das Objekt 'tuple' unterstützt keine Objektzuweisung –