繁体   English   中英

python的数学测验-str对象没有属性

[英]Maths quiz for python - str object has no attribute

我被分配了一项任务来记录学生数学测验的分数

下面是我的任务:

老师希望使用学生参加这些测验的结果来记录他们的表现。 系统应该为每个学生存储 > 最后三个分数。

每次运行我的代码时,我都会收到错误消息:AttributeError: 'str' object has no attribute 'append'

当我转换为 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()

另外我可能犯了哪些其他错误? 我该怎么做才能提高效率并完成这项任务?

字符串是不可变的。 你不能改变它。 完成后,您需要创建一个新字符串或创建一个列表并制作列表的字符串。 另外int需要一个数字字符串来转换。 None类型对象是一个值为None的变量。 int无法将None转换为整数,因此您会收到错误消息。

for row in ("Classroom {}.csv".format(classroom_num)):正在迭代一个字符串,而不是一个文件。 对于每次迭代,行是单个字符串('C' 然后是 'l' 等)。

row[0]因此与 row 和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]试图使用列表作为索引(假设您不是有意将其设置为None
  • status.close应该是一个方法调用
  • if state_ints == 3: state_ints在这一点上是一个列表。 它永远不会等于 3
  • 等等

看看这里发生了什么?

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

2
.
c
s
v
>>> 

您实际上并没有打开名为“Classroom[number].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 (...) 这意味着您可能会尝试两次打开同一个文件,从您以“追加”模式或其他令人困惑/冲突的操作打开的文件中读取。 只需坚持With open() - 这样,您也不必手动关闭文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM