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

Python嵌套循环读取CSV与ID文件时内层循环仅执行一次的原因排查

问题

我使用以下Python代码在CSV文件的指定列中搜索ID列表:

#!/usr/bin/python

import csv
import sys

with open(r"C:\Test\inputTest.csv", newline = '') as inputFile:
   inputReader   = csv.reader(inputFile, delimiter=",")
   idFile = open(r"C:\Test\testids.txt")
   loopcounter = 1
   for inputRow in inputReader:
    loopcountr+= 1
    print (loopcounter)
    inputString = inputRow[18]
    for id in idFile:
        print ("id: ", id)
        print ("InputString", inputString)
        result = inputString.find(id)
        print (result)

但遍历ID文件的嵌套循环仅运行一次,后续不再执行。输出如下:

1
 id:  123388

InputString  ID
-1
 id:  112233

InputString  ID
-1
 id:  141414
InputString  ID
-1
2
3
4
5
6
7
8
9
10

请问为何第二个(嵌套)循环无法每次都运行?

原因与解决办法
  • 核心原因:文件对象是一次性迭代器。第一次遍历idFile时,文件指针会移动到文件末尾,后续再尝试遍历这个文件对象时,已经没有剩余内容可以读取,所以嵌套循环不再执行。另外原代码存在拼写错误:loopcountr+= 1应为loopcounter += 1,这会导致运行报错,建议一并修正。

  • 解决办法1:提前读取所有ID到列表
    把ID文件的内容一次性读取到列表中,这样每次外层循环都可以遍历这个列表,操作更高效:

    # 修改后的代码
    import csv
    
    with open(r"C:\Test\inputTest.csv", newline = '') as inputFile:
        inputReader = csv.reader(inputFile, delimiter=",")
        # 读取ID文件到列表,同时去除每行末尾的换行符
        with open(r"C:\Test\testids.txt") as idFile:
            id_list = [line.strip() for line in idFile]
        loopcounter = 1
        for inputRow in inputReader:
            loopcounter += 1
            print(loopcounter)
            inputString = inputRow[18]
            for id in id_list:
                print("id: ", id)
                print("InputString", inputString)
                result = inputString.find(id)
                print(result)
    
  • 解决办法2:每次外层循环时重置文件指针
    如果ID文件极大,不想一次性加载到内存,可以每次外层循环前将文件指针移回文件开头:

    # 修改后的代码
    import csv
    
    with open(r"C:\Test\inputTest.csv", newline = '') as inputFile:
        inputReader = csv.reader(inputFile, delimiter=",")
        with open(r"C:\Test\testids.txt") as idFile:
            loopcounter = 1
            for inputRow in inputReader:
                loopcounter += 1
                print(loopcounter)
                inputString = inputRow[18]
                # 将文件指针重置到文件开头
                idFile.seek(0)
                for id in idFile:
                    id = id.strip()  # 去除换行符避免匹配干扰
                    print("id: ", id)
                    print("InputString", inputString)
                    result = inputString.find(id)
                    print(result)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:01:35