我正在为学校制作一个项目,用户在主题上进行测验,并将结果保存到“客户”(Fergus)的报告(称为“reportForFergusTwo”的CSV文件)中。该报告显示了某个测验的平均分数,高分以及实现该分数的人的用户名。然后,我打算显示用户的详细信息,但用户的详细信息保存在不同的CSV文件中(“详细信息”)。
到目前为止,我已经创建了一个函数,可以在CSV'reportForFergusTwo'中找到获得它的人的最高得分和用户名。我现在需要处理一个搜索另一个CSV文件的函数('详细信息')。
def findHighScoreUser():
print(user)
with open ('details.csv', 'r') as stalking:
stalkingReader=csv.reader(stalking)
valid4=False
for row in stalkingReader:
if user in row:
valid4=True
print("Here are the details for user {}... ".format(user))
splitter=row.split(',')
name=splitter[0]
age=splitter[1]
year=splitter[2]
print("Name: {}".format(name))
print("Age: {}".format(age))
print("Year Group: {}".format(year))
postReport()
if valid4==False:
print("Sorry Fergus, this user doesn't seem to be in our records.")
'user'是我之前函数的变量,在那里我找到了得分最高的人的用户名。它拥有用户名。我把它设为全局并在此功能开始时打印出来,这是有效的,让我觉得这是我在阅读CSV时遇到的问题。
以下是详细信息CSV:
Name,Age,Year Group,Username,Password
Erin Jones,15,11,Eri15,Password
Lucas Jones,16,11,Luc16,Password2
Michael Jordan,11,7,Mic11,GetSomeHelp
La Roux,14,9,La 14,Bulletproof
这是reportForFergusTwo CSV:
Subject,Difficulty,Score,Username
language,easy,10,Luc16
chemistry,easy,10,Luc16
maths,easy,9,Luc16
chemistry,easy,5,Eri15
chemistry,easy,6,Mic11
chemistry,easy,0,Eri15
我仍然对代码很新,所以如果答案很明显,请原谅。
答案 0 :(得分:1)
如果您的用户不在范围内,您可以将其提供给您的功能:
def functionThatFindsHighestScoreUser():
# do stuff
return maxScoreUser
def findHighScoreUser(user):
print(user)
# the rest of your existing code
# get the user
maxScoreUser = functionThatFindsHighestScoreUser()
# find it and print details
findHighScoreUser(maxScoreUser)
通过在函数中使用参数,几乎总有一种解决全局变量的方法 - 不要使用它们,为每个函数准确地提供所需的函数。
至于csv问题:csv模块为你提供分裂,如Tomalak所述。您可以直接使用阅读器并获取所有字段的列表:
import csv
def checkUsers(name):
with open("users.csv",encoding="utf8",newline='\n') as u:
reader = csv.DictReader(u, delimiter=',', quotechar='|' )
found = False
for row in reader:
if row["Name"] == name:
print("Here are the details for user {}... ".format(row["Name"]))
print("Name: {}".format( row["Name"]))
print("Age: {}".format( row["Age"]))
print("Year Group: {}".format( row["Year Group"]))
found = True
break # leave for loop
if not found:
print("Not in users")
checkUsers("Michael Jordan")
checkUsers("Chris Cringle")
输出:
OrderedDict([('Name', 'Michael Jordan'), ('Age', '11'),
('Year Group', '7'), ('Username', 'Mic11'), ('Password', 'GetSomeHelp')])
Not in users
答案 1 :(得分:0)
试试这个?:
import pandas
#read csv data
stalking = pandas.read_csv('details.csv')
#Select all records from the stalking csv where Username equals the user you are looking for
user_details = stalking[stalking['Username']==user]
#Print values for each column from subset of data which only contains records where username == user
print('Name: {}'.format(user_details['Name']))
print('Age: {}'.format(user_details['Age']))
print('Year Group: {}'.format(user_details['Year Group']))
编辑:仅供参考,如果有多个行具有相同的用户名,则会打印与该用户名关联的所有姓名,年龄和年份组。
pandas非常容易访问和使用csvs。完成var = pandas.read_csv(' somefile.csv')后,您可以使用var [' col1']访问给定列中的所有值。子集可以通过执行var [var [' col1'] ==' something']来读取'从数据集var中选择记录,其中col1的值为& #39;东西'
可以在此处找到pandas文档:http://pandas.pydata.org/pandas-docs/stable/
如果大熊猫看起来有点过于复杂而不适合你做什么,那么Dictreader可能也是一个很好的方法。