如何在CSV读取器找到第一个符合条件的数据后终止循环?
解决CSV读取中找到第一个匹配项后终止外层循环的问题
现有代码遍历CSV文件时,内层循环找到电话号码后只会跳出当前内层循环,外层的行遍历会继续执行,导致输出所有匹配的电话号码。需求是找到第一个符合条件的号码后立即停止所有循环。
现有代码
import csv as cs # 假设已导入csv模块 def isPhoneNumber(text): # 假设这是已实现的电话号码判断函数 return len(text) == 12 and text.count('-') == 2 with open("ten.csv", 'rb') as f: reader = cs.DictReader(f) for row in reader: for i in range(len(list_of_column_names[0])): if isPhoneNumber(str(row[list_of_column_names[0][i]])) == True: print(row[list_of_column_names[0][i]]) break
对应CSV数据
id,first_name,last_name,email,gender,dob,street,city,zip,state,drivers_license,phone,userid,ssn 1,Nanon,le Keux,nlekeux0@mlb.com,Female,4/25/2020,0 Blaine Trail,Charlotte,11111,NC,646144685,704-435-8128,1111122,123-45-6789 2,Brewster,Dagnall,bdagnall1@usnews.com,Male,2/27/2014,8 Farwell Point,Montgomery,11111,AL,146790405,334-133-5888,1111122,234-56-7890 3,Eirena,Whyborne,ewhyborne2@usda.gov,Female,9/16/1996,2120 Dexter Court,Washington,11111,DC,6732768794,202-558-7854,1111122,345-67-8901 4,Kippy,Sterndale,ksterndale3@bloglovin.com,Male,7/19/1965,61 Northwestern Place,Naples,11111,FL,7202285517,941-380-3634,1111122,456-78-9012 5,Creigh,Bleckly,cbleckly4@bloomberg.com,Male,10/29/1997,63151 Prairie Rose Circle,Tampa,11111,FL,9060794486,813-210-7870,1111122,567-89-0123 6,Caleb,Feldbaum,cfeldbaum5@springer.com,Male,10/23/1962,738 American Ash Park,Birmingham,11111,AL,5049418992,205-767-9467,1111122,678-90-1234 7,Luisa,Reeder,lreeder6@google.es,Female,9/3/2014,81399 Karstens Pass,Miami,11111,FL,3476652874,305-531-4287,1111122,789-01-2345 8,Bondon,Copper,bcopper7@census.gov,Male,1/9/1975,4439 Goodland Circle,Cincinnati,11111,OH,9573026686,513-966-8317,1111122,890-12-2344 9,Hedi,Aleksankov,haleksankov8@is.gd,Female,4/24/2021,4 Union Drive,Green Bay,11111,WI,5202059280,920-509-9672,1111122,901-23-4567 10,Uriah,Dunphie,udunphie9@hubpages.com,Male,2/4/2010,73 Hagan Hill,Bronx,11111,NY,8393306353,718-578-5726,1111122,012-34-5678
解决方案
方法1:使用标志变量
设置布尔变量标记是否找到目标,找到后修改标记,在外层循环中判断标记并跳出。同时优化列遍历逻辑,直接遍历列名而非索引,代码更简洁:
import csv as cs def isPhoneNumber(text): return len(text) == 12 and text.count('-') == 2 list_of_column_names = [['phone']] # 假设这里是目标列名列表 found = False with open("ten.csv", 'rb') as f: reader = cs.DictReader(f) for row in reader: if found: break for col in list_of_column_names[0]: value = str(row[col]) if isPhoneNumber(value): print(value) found = True break
方法2:用函数封装,利用return终止
把读取逻辑放到函数里,找到匹配项后直接return,自然终止所有循环:
import csv as cs def isPhoneNumber(text): return len(text) == 12 and text.count('-') == 2 list_of_column_names = [['phone']] def find_first_phone(): with open("ten.csv", 'rb') as f: reader = cs.DictReader(f) for row in reader: for col in list_of_column_names[0]: value = str(row[col]) if isPhoneNumber(value): print(value) return # 直接返回,终止所有循环 find_first_phone()
方法3:利用Python的for-else结构
外层循环的else块会在循环正常结束(未被break打断)时执行,内层找到匹配后,先break内层,再break外层:
import csv as cs def isPhoneNumber(text): return len(text) == 12 and text.count('-') == 2 list_of_column_names = [['phone']] with open("ten.csv", 'rb') as f: reader = cs.DictReader(f) for row in reader: for col in list_of_column_names[0]: value = str(row[col]) if isPhoneNumber(value): print(value) break else: continue # 内层循环没break,继续下一行 break # 内层循环break了,跳出外层循环
内容的提问来源于stack exchange,提问作者tlowa
相关产品推荐
相关产品推荐

