2016-04-27 4 views
-2

は私の仕事ではありませんしています数学クイズ - strのオブジェクトは、私は以下</p> <p>数学クイズのための学生のスコアを記録するために、タスクを割り当てられてきた無属性

教師が生徒からの結果を使用したいです彼らのパフォーマンスを記録するためにこれらのクイズを取る。システムは、各生徒の最後の3つの得点を保存する必要があります。

私は私のコードを実行するたびに、私はエラーが表示されます。 はAttributeError:「str」はオブジェクトが属性を持っていない

「を追加」と私はint型に変換するとき、私はこのエラーを取得: int型()の引数なければなりません文字列、バイトのようなオブジェクトまたは数字で、 'NoneType'ではありません。

import csv 
import os 

name = input("enter your name: ") 
classroom_num = input("enter your classroom number: ") 
score = 5 
print ("%s, you scored %d/10 questions correctly"%(name,score)) 
status = open ("state.txt","w") #Every time program is run +1 is added, so that column 1-3 are updated 
with open ("state.txt","r") as f: 
    state = f.read() 
    if os.stat("state.txt").st_size == 0: 
     status.write ("0") 

state_ints = [ int(x) for x in state.split() ] #converts into int 
addone = 1 
if state_ints == 3: #If program is run more than 3 times the value in text file reset to 0 
    state_ints = 0 
    status.write (state_ints) 
with open("Classroom {}.csv".format(classroom_num),"a+") as f: 
    rows = csv.reader(f) 
    for row in rows: 
     if row in rows in row[0] != (name) in row: #Checks if name exists in file (if so name isn't appended to column) 
      state_ints.append(addone) #Adds one everytime program is run so that score can be replaced for row 1-3 
      status.write (state_ints) 
      name_row = (row [0]) 
      name_row.append(name) 
      score_row = (row (state_ints)) 
      score_row.append(score) 
     else: 
      state_ints.append(addone) 
      status.write (state_ints) 
      score_row = (row [state_ints]) 
      score_row.append(score) 
status.close() 

他にも間違いはありますか?これをより効率的かつ完全にするために私は何ができますか?

+1

'state_ints = state_ints.append(addone)' - 'append'について教材を見直すことをお勧めします。 – TigerhawkT3

+1

私は恐れている "私のコードのすべてのエラーを修正する"は、SOの話題になるための十分な質問ではありません。 – TigerhawkT3

答えて

0

文字列は不変です。それを変更することはできません。完了したら、新しい文字列を作成するか、リストを作成してリストの文字列を作成する必要があります。また、intには、変換する数字の文字列が必要です。タイプオブジェクトはNoneという値の変数です。 intNoneを整数に変換できないため、エラーが発生します。

0

for row in ("Classroom {}.csv".format(classroom_num)):は、ファイルではなく文字列で繰り返し処理されます。反復ごとに、行は単一の文字列( 'C'、 'l'など)です。

row[0]は行と同じで、name_row.append(...は文字列にappendを呼び出そうとしているため、 '' str 'オブジェクトには属性' append '"エラーがありません。

int()コールは失敗していますが、回線state_ints = state_ints.append(addone)state_intsからNoneに設定されています。 appendは、リストを適位置に変更し、Noneを返します。あなたはちょうどstate_ints.append(addone)がほしいと思う。あなたは何も(an_object)が正確にan_objectと同じではないん括弧内の単一アイテムを置くチュートリアル

  • の口コミを投稿することができます示唆だけでなく、他のいくつかの問題があり

    です。

  • row [state_ints]
  • は、メソッド呼び出し
  • if state_ints == 3:state_intsにする必要があります
  • status.close(あなたがNone にそれを設定することを意味するものではありませんでしたと仮定した場合)インデックスとしてリストを使用しようとしていることは、この時点でのリストです。ここで何が起こっているかを参照してください3
  • など
+0

私は少し混乱しています、あなたは私に例を教えてくれますか? –

+0

@MushtakNadim、何の例? – Holloway

+0

私は自分のコードを更新しましたが、実行するとデータがcsvファイルに追加されず、 "状態"ファイルも0のままであるため、データが追加されても最後の3つのスコアは更新されずに追加されます行にこれを引き起こす問題があるかどうか確認できますか? –

0

を等しくするつもりはありませんの?

>>> for row in ("Classroom {}.csv".format("2")): 
...  print row 
... 
C 
l 
a 
s 
s 
r 
o 
o 
m 

2 
. 
c 
s 
v 
>>> 

あなたが実際に「教室[番号] .CSV」と呼ばれるファイルを開いていないものの、その代わりに、ファイル名の文字を反復しています。 普通はappendをcsvの行に使用できます(通常はまたはcsvモジュール経由で手動でリストに変換されます)。実際に行がでないため、行/リストではなく文字/文字列。

with openを使用し、手動でコンマで区切るか、またはファイルを解析するためにcsvモジュールを使用できます。モジュールのアプローチは:

>>> import csv 
>>> 
>>> with open("Classroom {}.csv".format(classroom_num),"r") as f: 
...  rows = csv.reader(f) 
...  for row in rows: 
...   print(row) 

あなたは再使用してファイルを開くときにファイルハンドルfを保ちます。また、with open()f = open (...)の両方を使用します。つまり、同じファイルを2回開いたり、「追加」モードで開いたファイルから読み込んだり、他の混乱したり矛盾する行為を試みたりしている可能性があります。単にWith open()に固執するだけで、手動でファイルを閉じる必要はありません。

+0

ファイルは既にfとしてオープンされていますが、使用されることはありません – Holloway

+0

@Holloway True: 'f = open(...)'行について何かを追加し、答えにファイルハンドルを再定義します。 'f'はスクリプト内のファイルに使用される唯一のファイルハンドル/変数名のようです。 – jDo