我正试图弄清楚一些简单的东西。我正在敲打我的脑袋。
基本上我有.CSV,其中包含名称和测试分数,例如
Brad 4, 5, 7, 7
Dan 3, 6, 2, 7
我想要做的是编写代码,首先打印出测试分数。这个位工作正常。
我无法工作的方面是程序在CSV中读取名称的部分。如果名称存在,则会在开头添加新分数的CSV。因此,在数组位置1插入新值。
如果CSV中没有该名称,它将添加名称,然后再将值插入数组位置1.
这是目前不起作用的代码,我不认为它复杂但我必须考虑错误。
import csv
def names():
global fn
fn = input("please enter first name \n").title()
namecheck = False
while namecheck == False:
nc = input("you have entered " + fn + " are you sure \n 1) Yes \n 2) No")
if nc == "1":
quiz()
namecheck = True
if nc =="2":
names()
def quiz():
option = input("do you want to print or append? \n 1) Print 2) Append")
if option =="1":
f = open('namelist.csv', 'r')
a = f.read()
print(a)
if option =="2":
score = input("please enter score")
score = int(score)
with open('namelist.csv', 'rt') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
for field in row:
if field == fn:
XXXXXXXX <--- this is were I think I am going wrong.
names()
答案 0 :(得分:0)
当您声明def时,您必须缩进整个部分。
def quiz():
[-->INDENT HERE!] option = input("do you want to print or append? \n 1) Print 2) Append")
[-->INDENT HERE!] rest of def..
#back to main statements..
(当然我不是故意要你输入“[ - &gt; INDENT HERE!]”字面意思)
答案 1 :(得分:0)
每次有人添加新分数或新名称时,您是否必须真正写入文件?如果在程序结束时写入文件是一个选项,我建议提前收集所有信息,然后将数据批量写入结尾......这样你就可以维护内存中的所有内容并使用I / O进行操作。文件一次性使用,节省了大量的文件操作,并为您提供了使用python数据结构(如dicts / sets等)的便利....
如果那不是一个选择...... 通过读取文件来查找名称是非常低效的,因为您正在阅读整个文件,只是为了查看名称是否存在。
我建议使用dict
来存储您已输入的名称列表。这样检查dict
以查看名称是否存在更有效...您可以尝试存储带有key = name和value =行号的dict,并在写入时输入名称CSV。
这样,如果你在dict中找到了这个名字,你就可以去特定的行,然后像这样追加你的数据:
Start reading and writing on specific line on CSV with Python
要在第一个位置插入一个元素(我假设这是在名称之后),你可以这样做:
l = line.split(",")
#assumes first element is the name of the person
l.insert(1, new_score) # 1 is the position you want to insert the data
#then insert this data into a_NEW_CSV file, as writing to same CSV at same line is difficult...