Python读取CSV的函数在while循环中仅首次运行有效问题
问题分析与解决
问题根源
你遇到的问题核心在于csv.reader返回的是一次性迭代器:第一次调用kampInfo时,for rad in filinnhold已经遍历完所有CSV行,迭代器指针停在了末尾。第二次调用函数时,迭代器中没有剩余数据可遍历,直接跳过循环,因此永远输出"Fant ikke"。
解决方案
把CSV数据提前加载到列表中,让每次查询都能从头遍历完整数据集,具体修改如下:
修改后的完整代码
import csv filnavn = "kamper_toppserien.csv" with open(filnavn, encoding="utf-8-sig") as fil: # 将CSV读取结果转为列表,一次性加载所有数据 filinnhold = list(csv.reader(fil, delimiter=";")) # 取出表头行,剩下的是比赛数据 overskrifter = filinnhold.pop(0) def kampInfo(runde, lagnavn): funnet = 0 # 遍历列表中的所有数据行(每次都是从头开始) for rad in filinnhold: erunde = rad[0] ehjemmelag = rad[4].split() hjemmelag = rad[4] bortelag = rad[5] ebortelag = rad[5].split() resultat = rad[6] bane = rad[7] klokke = rad[3] dato = rad[1] if runde == int(erunde): if lagnavn.split()[0] in ehjemmelag or lagnavn.split()[0] in ebortelag: print(f"Kamp: {hjemmelag} mot {bortelag}. ") print(f"Resultatet av kampen ble {resultat} ") print(f"Kampen ble spilt på {bane} klokken: {klokke}, dato: {dato} ") funnet += 1 if funnet == 0: print("Fant ikke") ferdig = False while not ferdig: try: print("Tast 0 i runde for å avslutte søket") runde = int(input("runde: ")) if runde == 0: ferdig = True else: print("Skriv lagnavn med stor forbokstav") lagnavn = input("Lagnavn: ") if lagnavn.isdigit(): print("Sjekk at du har skrevet lagnavn og ikke tall.") else: kampInfo(runde, lagnavn) except: print("Har du husket å skrive runden som et tall(int)? ")
关键修改点
- 将
csv.reader(fil, delimiter=";")转为list(csv.reader(...)),把一次性迭代器转换为可重复遍历的列表 - 用
filinnhold.pop(0)取出表头行,确保后续遍历的都是有效比赛数据
修改后,每次调用kampInfo都会从头遍历完整数据集,第二次查询也能正常匹配结果。
内容的提问来源于stack exchange,提问作者aleks_mj
相关产品推荐
相关产品推荐

