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

Python嵌套for循环仅执行一次排查:CSV文件匹配需求

问题分析与解决方案

嘿,这个问题我之前踩过坑!你遇到的外层循环只执行一次的原因很简单:CSV reader是一次性迭代器。当你第一次在内层循环里遍历csv_file_sounds时,它已经把文件的指针移到了末尾,第二次外层循环再试图遍历它的时候,已经没有任何数据可以读取了,所以外层循环自然只跑了一轮。

为什么会这样?

Python里的文件对象和基于它的CSV reader都是"耗尽型"迭代器——一旦你遍历过一次,它们内部的指针就停在最后,不会自动重置到开头。除非你重新打开文件,或者把数据先全部加载到内存里。

优化后的解决方案

与其嵌套遍历两个CSV(时间复杂度O(n*m),数据量大的时候会超级慢),不如先把sample_2.csv里需要的内容预加载到一个字典中,这样后续匹配只需要O(1)的查找时间,效率高得多。

修改后的代码如下:

#!/usr/bin/python
import csv
import sys

# 第一步:把sample_2的关键数据预加载到字典,用匹配键做key,目标值做value
sound_lookup = {}
with open('sample_2.csv', "rb") as sound_file:
    sound_reader = csv.reader(sound_file, delimiter=';')
    for row in sound_reader:
        # 加个长度判断,避免因CSV列数不足导致索引越界
        if len(row) > 21 and len(row) > 15:
            sound_lookup[row[21]] = row[15]

# 第二步:遍历sample_1,直接查字典找匹配项
with open('sample_1.csv', "rb") as main_file:
    main_reader = csv.reader(main_file, delimiter=';')
    for row in main_reader:
        # 检查当前行的第一个元素是否在字典里
        if row[0] in sound_lookup:
            print sound_lookup[row[0]]

额外注意事项

  1. 重复匹配项处理:如果sample_2.csv里有多个相同的row[21]值,上面的代码会用最后一个覆盖前面的。如果你需要保留所有匹配结果,可以把字典的值改成列表:
    sound_lookup.setdefault(row[21], []).append(row[15])
    
    然后打印时循环输出列表里的所有内容。
  2. 文件安全:用with语句打开文件会自动帮你关闭文件,比直接open()更安全,能避免资源泄漏。
  3. 索引越界:加了len(row) > 21的判断,防止CSV文件里某些行的列数不足导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:54:04