我有一个预订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示例)
在此先感谢您的帮助!
答案 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是一个非常通用且有用的库,并且逻辑简单,可以限制程序中的循环数。