2016-03-31 8 views
0

私は3つのファイルを持つpythonプログラムを書いています。 1つはメインファイル、1つはクラスファイル、もう1つはデータファイルです。データファイルは2つのテキストファイルから読み込み、クラスとメインファイルで使用するためにデータを分割して配置します。とにかく、私はかなり多くのデータとメインファイルで行われていますが、クラスファイルに問題があります。その一般的な文字列の書式設定の問題ですが、私はそれを修正するために可能なことを理解できません。私はbirthDayはintのリスト、文字列のないリストがあるようですが、私には思えるのエラーPythonのクラスファイルのintとstringエラー

" 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

'self._birthDay'は文字列ですか?いつこのエラーが発生していますか? –

+1

いくつかのキャッシュや何かを更新する以外に、 '__repr__'メソッドでオブジェクトを変更しないでください。 – Paul

+0

私はメインファイルとデータファイルを更新して追加しました。 –

答えて

0

を取得しています。あなたは、彼らがすべての文字列をしていることを確認したい場合は

、あなたが試すことができます:

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

を別の方法として、あなたは彼らがすべての文字列であることをを知って場合は、あなたが最初の場所での書式文字列を使用することができますこれらlenチェックを避ける:

さらに良い
self._birthDay = ['{:02d}'.format(x) for x in birthDay] 

、しかし、datetime.datetimeオブジェクトとしてbirthDayを表現することです。それは常に3つのint型、月、日、年として来てと仮定すると、あなたは何だろう:

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

次に、あなたの__repr__datetime.strftime方法を利用することができます。

編集

あなたの更新に応じて、私はあなたが、使用をgetDataの上部にfrom datetime import datetimeを追加し、その後、代わりに月/日/年を解析する必要があると思う:

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ているので、あなたはあまりにも複雑されることなく合理的に正確になりますint((datetime.datetime.now() - self._birthDay)/datetime.timedelta(days=365))を返すようにcurrentAge()を更新する必要があります。

+0

申し訳ありません。私は今、より明確にするために、メインファイルとデータファイルを追加しました。 –

+0

@JakeMeyer私の答えを更新しました。 – Paul

+0

ありがとうございますが、このメソッドを使用すると、def currentAge(self)メソッドのif else文をどのように更新しますか? myMonth <=月とmyDay <=日の場合: 戻る年 - myYear #そうでない場合は、現在の推定年齢よりも1年少ないです。 else: return year - myYear - 1 –

2

使用string formatting、ない文字列の連結は、それがずっとクリーナーです:

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

プラスあなたはこの形式を使用している場合、それはエラーメッセージの状態として、あなた

+0

if elif文を書くべきですか? –

+0

''3'zfill(2)' –

+0

私はあなたの誕生日が時には数字であることに気がつきました。 '' {!s:0> 2} '。format(3) 'サイズで調べてください。 –

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

もチェックしてください。私は今、より明確にするために、メインファイルとデータファイルを追加しました。 –

+0

それは私にエラーを与えています ファイル "/ Users/admin/Desktop/Program 6/FINAL/classFile.py"、84行目、__repr__内 self._birthDay [0] = "0" + str(self。 _birthDay [0]) TypeError: 'tuple'オブジェクトはアイテムの割り当てをサポートしていません –

関連する問題