【问题标题】:Comparing input values with csv file in Python 3.4在 Python 3.4 中将输入值与 csv 文件进行比较
【发布时间】:2017-08-20 21:53:30
【问题描述】:

我有一个简单的问题,但我真的找不到合适的解决方案。

我有一个 csv 文件,其中包含学生的姓名和他们注册的科目: 名称、主题 1、主题 2、主题 3 学生1,MN1,MN2,MN3 学生2,BN1,BN2,BN3 学生3,MN4,MN5,MN6

学生需要输入自己的姓名和学科名称,以检查他是否注册了该学科

我的代码:

import csv

Name = input("Please provide your name: ")
Subject = input("Please provide your Subject: ")

with open('students.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        if (row['name'] == Name and row['subject1'] == Subject or 
row['subject2'] == Subject or row['subject3'] == Subject):
            print ("You are registered. It won't take long to run your VM")
        else:
            print ("You are not registered")

我的问题是它给了我多个输出 输出: 请提供您的姓名:Student3 请提供您的主题:MN4 您还没有注册 您还没有注册 您已注册。运行您的虚拟机不会花费很长时间

显然,它应该只是: 您已注册。运行您的虚拟机不会花费很长时间

你能帮我解决这个问题吗? 谢谢

【问题讨论】:

    标签: python csv


    【解决方案1】:

    请注意,Python 中的for 循环有一个可选的else 子句,当循环结束时没有break 语句时将执行该子句...

    您的代码会打印循环的每次迭代。你想要的只是在循环结束时打印......

    with open('students.csv') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            if (row['name'] == Name and (row['subject1'] == Subject or row['subject2'] == Subject or row['subject3'] == Subject)):
                print("You are registered. It won't take long to run your VM")
                break
        else:
            print("You are not registered")
    

    【讨论】:

    • 谢谢,它可以工作,但不适用于最后一次迭代,它会在第一次迭代后停止
    【解决方案2】:

    我相信字典最适合你:

    import csv
    
    data = {i[0]:i[1:] for i in csv.reader(open('filename.csv'))}
    
    Name = input("Please provide your name: ")
    Subject = input("Please provide your Subject: ")
    
    if Subject in data[Name]:
        print("you are registered")
    else:
        print("you are not registered")
    

    【讨论】:

    • data = {i[0]:i[1:] for i in csv.reader(open('filename.csv'))} - 你能解释一下这一行吗?谢谢,它有效。
    • @Ruslan 该行称为字典理解。它从您的 csv 文件中获取每一行,并使用第一个元素 i[0] 创建一个字典键。然后,使用列表切片创建此字典的值,该切片通过保留列表的右半部分(从第二个元素开始)来改变 i
    • 谢谢!如果您不介意我还有另一个问题,我正在添加第二个 csv 文件,如果名称和主题匹配则需要使用它......所以我需要为第二个 csv 文件添加另一个字典?
    • @Ruslan 实际上取决于。您可以使用其他字典;但是,您也可以使用 zip() 来遍历两者的内容。请发布您的第二个 csv 文件的样本,并详细说明您想用它做什么。
    【解决方案3】:

    数据框将是存储 csv 文件的良好结构。请阅读here,无论如何都要使用您的代码。请参考以下代码。

    请为此安装 pandas 和 numpy

    pip install pandas
    pip install numpy
    

    代码:

    import pandas as pd
    import numpy as np
    
    df = pd.read_csv("testing.csv")
    
    Name = input("Please provide your name: ")
    Subject = input("Please provide your Subject: ")
    
    query = '(name == '+ '\'' + Name + '\'' + ') and (subject1 == '+ '\'' \
             + Subject + '\'' + ' or subject2 == ' + '\'' + Subject + '\'' \
             + ' or subject2 == ' + '\'' + Subject + '\')'
    
    if df.query(query).empty:
        print ("You are registered. It won't take long to run your VM")
    else:
        print ("You are not registered")
    

    参考:

    1. pandas query

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2016-10-18
      • 2018-05-04
      • 1970-01-01
      • 2022-09-22
      相关资源
      最近更新 更多