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
相关产品推荐
相关产品推荐

