Python嵌套循环读取CSV文件结果不符合预期的问题
问题原因与解决办法
原因解析
Python里的文件对象是一次性迭代器,遍历的时候会从当前位置逐步读取,直到文件末尾,指针不会自动重置。你的代码执行流程是这样的:
- 第一次外层
for X in temp:读取文件第一行,打印loop_1 - 进入内层
for Y in temp:从文件第二行开始读取,把剩下的两行全部读完,所以打印两次loop_2 - 此时文件指针已经走到末尾,后续的外层循环再遍历
temp时,没有任何内容可读,循环直接结束,自然不会再输出你期望的那些loop_1和loop_2
解决方法
要实现你要的嵌套循环效果,核心是让内层循环每次都能遍历完整的文件内容,而非剩余内容。这里推荐两种可靠的方式:
方式1:提前将文件内容读取到列表(最优)
把文件所有行存入列表后,列表可以被重复遍历,完全满足嵌套循环的需求,同时用with语句自动管理文件,避免资源泄漏:
with open("file.csv", "rt") as file: # 读取所有行到列表 file_lines = file.readlines() # 外层循环遍历列表的每一行 for _ in file_lines: print("loop_1") # 内层循环同样遍历整个列表 for __ in file_lines: print(" loop_2")
方式2:每次内层循环前重置文件指针并重新遍历
手动将文件指针移回文件开头,让内层循环能重新读取全部内容,但这种方式需要注意外层循环的遍历逻辑,避免指针位置导致的异常:
file = open("file.csv", "rt") # 先把所有行读取到列表,用于控制外层循环次数 all_lines = file.readlines() file.close() for _ in all_lines: print("loop_1") # 每次内层循环重新打开文件,确保从头读取 with open("file.csv", "rt") as inner_file: for __ in inner_file: print(" loop_2")
或者如果不想重新打开文件,也可以用seek(0)重置指针,但要注意外层循环不能直接遍历原文件对象,而是基于列表控制次数:
file = open("file.csv", "rt") all_lines = file.readlines() for _ in all_lines: print("loop_1") file.seek(0) # 将指针重置到文件开头 for __ in file: print(" loop_2") file.close()
内容的提问来源于stack exchange,提问作者eazfze66
相关产品推荐
相关产品推荐

