
[英]Python - AttributeError: 'str' object has no attribute 'append' - maths game
[英]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.