在csv文件中查找特定记录

时间:2018-02-28 20:38:30

标签: python csv python-3.6

我正在为学校制作一个项目,用户在主题上进行测验,并将结果保存到“客户”(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

我仍然对代码很新,所以如果答案很明显,请原谅。

2 个答案:

答案 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可能也是一个很好的方法。