python - 在python中直接写入.csv时,如何防止用户输入相同的输入两次
问题描述
我正在尝试从用户输入创建数据集。我试图防止其中一个字段重复。我要求用户选择一个与他们的姓名、年龄、gpa 和专业相匹配的字母。我想确保输入的字母是唯一的,但我不确定在直接写入 .csv 文件时如何执行此操作。
这是我到目前为止所拥有的。
import csv
from colorama import Fore, Back, Style
with open('students2.csv', 'w+', newline='') as csvfile:
columnheaders = ['NAME','AGE','GPA','MAJOR']
writer = csv.DictWriter(csvfile, fieldnames=columnheaders)
writer.writeheader()
for i in range(0,10):
askname=input('Please select the letter that matches your name from the following: (A, B, C, D, E, F, G, H, I, J), ')
askage=input('Please enter your Age: ')
askgpa=input('Please enter your GPA: ')
askmajor=input('Please select your major from the following (CS, CET, CIS, CE) ')
writer.writerow({'NAME': askname,'AGE': askage,'GPA': askgpa,'MAJOR': askmajor})
print(Back.BLACK +'My name starts with the letter:', askname ,' and I am ', askage, 'years old. I study ', askmajor, 'and my GPA is: ', askgpa)
print(Style.RESET_ALL)
我知道如何通过列表来做到这一点,
namelist = []
while True:
#Input name
while True:
name = str(input('What is your name? '))
if name.upper() not in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'):
print("Please use (A, B, C, D, E, F, G, H, I, J).")
continue
if name in namelist:
print("This name has already been used.")
continue
else:
namelist.append(name)
break
但是是否可以做到这一点而不必通过列表进行然后将其转换为 .csv?
任何帮助将不胜感激。提前致谢。
解决方案
您需要在内存中保留一份列表副本(您可以每次都扫描 CSV,但这会导致大量不必要的磁盘 IO)。
我的建议是将名称缓存在一组中,因此您会nameseen = set()
在脚本顶部有类似的内容,然后在写入行之前检查它。就像是:
if not (askname in nameseen):
writer.writerow({'NAME': askname,'AGE': askage,'GPA': askgpa,'MAJOR': askmajor})
nameseen.add(askname)
print(Back.BLACK +'My name starts with the letter:', askname ,' and I am ', askage, 'years old. I study ', askmajor, 'and my GPA is: ', askgpa)
print(Style.RESET_ALL)
else:
print("This name has already been used.")
推荐阅读
- typescript - Typescript - 从映射中替换类型属性名称
- excel - 使用 Powershell 在 Excel 列中添加时间戳
- javascript - 验证登录页面 - 如果密码正确则返回主页,如果不正确则留在同一页面
- python - 在 Raspberry Pi 上运行 FLASK 的 NGINX 服务器
- javascript - 如何使对象键的值成为用户在html中的输入搜索
- python-3.x - 优化器得到一个空的参数列表(skorch)
- ios - Swift 4 错误的日期和时间
- sql - 在 PostgreSQL 中使用一个 sql 返回两个值
- unity3d - 为什么Realisic Fps Prefab枪在游戏中变得太大?
- seaborn - 如何在seaborn中仅绘制误差条的正面?