2016-04-27 62 views
-2

我被分配到記錄學生的分數爲數學測驗數學測驗 - 海峽對象沒有屬性

下面一個任務是我的任務:

老師想用學生的成績通過這些測驗來記錄他們的表現。系統應該爲每個學生存儲>最後三個分數。

每次我我的代碼運行時我收到錯誤: AttributeError的:「海峽」對象有沒有屬性「追加」

,當我轉換成一個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需要一串數字進行轉換。 A None類型對象是值爲None的變量。 int無法將None轉換爲整數,因此出現錯誤。

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設置爲Noneappend修改列表並返回None。你只需要state_ints.append(addone)

還有一些其他的問題,以及暗示你可能想要查看一個教程

  • 把一個單一的項目在括號內什麼也不做(an_object)是完全一樣an_object
  • row [state_ints]正試圖用一個列表作爲索引(假設你並不想將其設置爲None
  • status.close應該是一個方法調用
  • if state_ints == 3:state_ints在這一點上的列表。它永遠也不會等於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」的文件,但是,相反,你迭代字符的文件名。 您通常可以在csv的行上使用append,因爲它們通常會轉換爲列表(手動通過split(",")或通過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 (...)。這意味着你可能試圖打開同一個文件兩次,從你以「append」模式打開的文件或其他混淆/衝突的操作中讀取。只需堅持With open() - 這樣,您不必手動關閉文件。

+0

該文件已經打開爲f,但從未使用 – Holloway

+0

@霍洛威真:我會添加一些關於'f = open(...)'行並重新定義答案中的文件句柄。 'f'似乎是腳本中用於文件的唯一文件句柄/變量名稱。 – jDo

相關問題