You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)? ")

关键修改点

  1. 将csv.reader(fil, delimiter=";")转为list(csv.reader(...)),把一次性迭代器转换为可重复遍历的列表
  2. 用filinnhold.pop(0)取出表头行,确保后续遍历的都是有效比赛数据

修改后,每次调用kampInfo都会从头遍历完整数据集,第二次查询也能正常匹配结果。

内容的提问来源于stack exchange,提问作者aleks_mj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:22:47