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

