我正在尝试编写一个简单的算术测验。一旦用户完成测验,我想将他们的名字和分数写入文本文件。但是,如果他们已经完成了测验,那么他们的新分数应该与之前的分数相同。
目前,文本文件包含:
Raju,Joyal : 10
但是,当以相同的姓氏完成测试时,新的分数不会附加到此行,并且当以不同的姓氏完成测试时,根本不会向文本文件写入新行。
这是我的代码:
rewrite = False
flag = True
while flag == True:
try:
# opening src in a+ mode will allow me to read and append to file
with open("Class {0} data.txt".format(classNo),"a+") as src:
# list containing all data from file, one line is one item in list
data = src.readlines()
for ind,line in enumerate(data):
if surname.lower() in line.lower():
# overwrite the relevant item in data with the updated score
data[ind] = "{0} {1}\n".format(line.rstrip(), ", ",score)
rewrite = True
else:
src.write("{0},{1} : {2}{3} ".format(surname, firstName, score,"\n"))
if rewrite == True:
# reopen src in write mode and overwrite all the records with the items in data
with open("Class {} data.txt".format(classNo),"w") as src2:
src2.writelines(data)
flag = False
except IOError:
errorHandle("Data file not found. Please ensure data files are the in same folder as the program")
答案 0 :(得分:2)
您正在打开文件但是,因为您处于“追加”模式(a+
),您的读/写指针位于文件的 end 。因此,当您说readlines()
时,您什么也得不到:即使文件不为空,也没有更多行超过您当前的位置。因此,您的for
循环遍历长度为0的列表,因此代码永远不会运行。
您应该阅读有关使用文件的信息(查找关键字seek
和tell
)。
请注意,即使您位于文件中间的正确位置,覆盖现有文件中已有的内容也不是一个好方法:如果您要编写的数据是不同的数字你想要覆盖的字节数,你会遇到问题。相反,您可能希望打开该文件的一个副本以进行读取,并创建一个要写入的新副本。当它们完成并关闭时,移动较新的文件以替换较旧的文件。
最后请注意if surname.lower() in line.lower()
不是水密逻辑。如果您的文件包含条目Raju,Joyal: 10
而其他人的姓氏为“Joy”,会发生什么?
答案 1 :(得分:0)
这是我自己的项目,但我不知道它是否有帮助:
file=open("Mathematics Test Results (v2.5).txt","a")
file.write("Name: "+name+", Score: "+str(score)+", Class: "+cls+"."+"\n")
file.close()