python csv-如果第1列和第2列具有特定值,则打印CSV值

时间:2019-01-16 14:14:16

标签: python csv

我有一个预订CSV文件,带有以下标题: 名,姓,预订日期,主题,上课时间,班级人数

我希望读取CSV文件,并且仅打印预订日期为“(确定值)”且课程期限为“(确定值)”的行

到目前为止,我的代码是:

check_date = "11/01/2019"
check_period = "Lesson 3"

with open("Bookings.csv") as f:
    reader = csv.reader(f)

    header = next(reader)
    found = False
    for line in reader:
        if line[2] == check_date and line[4] == check_period:
            for line in reader:
                print(line)
            found = True
            break
    if not found:
        print("No bookings for", check_date, " ", check_period)

但是,与其输出日期为“ 11/01/2019”,上课时间为“第3课”的行,不如输出具有该条件的第一行,而忽略其余内容,并在此之后打印下一行这个。

以下屏幕截图: (显示代码,输出和CSV示例)

Code Running

在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您的问题在以下部分中:

if line[2] == check_date and line[4] == check_period:
            for line in reader:
                print(line)

删除for line in reader:

您正试图不做进一步检查就继续循环处理数据,这还会使您的外循环陷入困境

并且正如asmox所述,还要删除break语句

答案 1 :(得分:0)

尝试删除break语句中的if。使用break,您可以在找到合适的行后停止遍历列表

答案 2 :(得分:0)

我相信,实现此可伸缩性的最佳方法是使用流行的“ .csv”库熊猫。在其中,有几种方法可以检查.csv文件,而无需循环浏览所有行。此外,如果您遇到了很大的.csv文件,它也可以非常好地工作。

import os
import pandas as pd
#Assign csv_file to variable names
dir_path = os.path.dirname(os.path.realpath(__file__))
name_csv = 'Bookings.csv'

check_date = "11/1/2019"
check_period = "Lesson 3"

#Read CSV into Pandas format called a DataFrame
csv_path = os.path.join(dir_path,name_csv)
DFAll = pd.DataFrame.from_csv(csv_path)

#Check DataFrame with a Boolean qualifiers that return True if check_date 
#AND check_period are found in each column. 
#Then select only True rows from the .csv DataFrame

DFCheckedDates=DFAll[DFAll['Date'].str.match(check_date) & \
DFAll['Period'].str.match(check_period)]

#Return Rows were the conditions are both true
print(DFCheckedDates)

我希望这对您有所帮助。考虑到您的5行.csv文件,可能看起来有点过分,但是当广泛使用.csv文件时,Pandas是一个非常通用且有用的库,并且逻辑简单,可以限制程序中的循环数。