Python中while循环正常执行时嵌套for循环仅运行一次问题排查
问题描述
Python编写过程中出现异常:外层while循环可正常执行,但嵌套在while中的for循环仅运行一次,原始代码如下:
import os import json import csv import pandas as pd os.chdir("C:/Users/lchavan/Test 4") df= "C:/Users/lchavan/Test 4" dir_list = os.listdir(df) for filename in os.listdir(df): with open(filename) as json_file: data = json.load(json_file) print(filename) i = 0 while i >= 0: x = data[0]['created'] if i < len(x): y = x[i] for k,v in y.items(): if k == 'geomenter code hereetry': z = y['geometry']['coordinates'] print (z) i+=1 pass
问题排查结果
代码存在4个直接导致异常的问题:
- while循环条件设置错误:
i >= 0为恒真条件,i从0开始持续自增永远不会满足退出条件,属于无限死循环,会持续占用CPU资源空跑 - 键名拼写错误:判断键值时写的是
geomenter code hereetry,是编辑代码时误插入了编辑器占位符,和实际要匹配的geometry键名完全不匹配,绝大多数场景下无法进入取坐标的逻辑,视觉上就表现为for循环仅运行一次 - 重复赋值冗余:
x = data[0]['created']写在while循环内部,每次循环都会重复执行相同的赋值操作,无意义消耗性能 - 无循环终止逻辑:当i增长到大于等于
len(x)后,没有设置break跳出循环的逻辑,i会持续无限自增
除此之外还有几处冗余/风险点:导入了csv、pandas库但全程未使用,定义了dir_list变量未调用,打开文件时未指定编码,未过滤目录下非JSON格式文件,容易触发读取报错。
修复后代码
直接用for循环迭代替代手动维护索引的while循环,从根源避免索引越界、死循环问题,同时修正拼写错误、补全异常防护:
import os import json os.chdir("C:/Users/lchavan/Test 4") target_path = "C:/Users/lchavan/Test 4" for filename in os.listdir(target_path): # 过滤非json文件,避免读取报错 if not filename.endswith(".json"): continue # 显式指定文件编码,避免乱码 with open(filename, "r", encoding="utf-8") as json_file: data = json.load(json_file) print(f"正在处理文件:{filename}") content_list = data[0]["created"] # 直接迭代元素,无需手动维护索引 for item in content_list: for k, v in item.items(): if k == "geometry": coordinates = item["geometry"]["coordinates"] print(coordinates)
注意事项
- 遍历Python序列(列表、字典等)时,优先使用for直接迭代元素,尽量避免手动维护索引写while循环,能大幅降低死循环、索引越界的bug概率
- 写文件读取逻辑时尽量显式指定编码,同时过滤不符合格式要求的文件,减少环境差异导致的报错
- 编写代码时注意不要把编辑器的自动补全占位符误写到业务逻辑里,写完逐行检查字符串拼写是否正确
内容的提问来源于stack exchange,提问作者Lalit Chavan
相关产品推荐
相关产品推荐

