前言
本文适合Python新手学习,解决循环编写时最常见报错:在循环内初始化列表、字典、变量,导致历史数据丢失、数据被覆盖、计数统计出错。文中整理错误案例、问题原因、正确写法、避坑技巧,适配文件遍历、数据分组、数字统计、字符串拼接日常开发场景,日常写代码可直接对照自查。
一、问题场景还原
业务需求
遍历多个文件夹,筛选每个文件夹内指定后缀文件,单独保存每个文件夹的筛选结果,最后汇总所有文件夹数据,支持分组查看、合并查看数据。
错误代码示范
python import os # 存放所有文件夹汇总分组结果 all_file = [] # 外层循环:遍历每个分类子文件夹 for folder in ["folder1", "folder2", "folder3"]: # ❌ 致命踩坑:列表初始化写在循环内部,每轮循环新建空列表 target_file = [] # 模拟读取当前文件夹下文件 for file in os.listdir(folder): # 筛选后缀为_target.txt的目标文件 if file.endswith("_target.txt"): target_file.append(file) # 存入本轮文件夹文件列表 all_file.append(target_file) print(target_file)# 输出 [] 空列表!仅保留最后一轮循环变量 print(all_file) # 结果正常,存储全部文件夹分组列表 |
核心现象解读
target_file = [] 写在循环内部:每执行一次循环,都会新建空列表,直接清空上一轮文件夹的数据;
循环结束后:临时变量target_file只会保留最后一轮循环的数据,打印这个变量,很容易误以为代码丢数据;
代码隐患:如果不用外层列表append汇总数据,只靠这个临时变量存数据,最终只会保留最后一组数据,前面所有数据全部丢失。
新手高频错误(极易踩坑)
想要累加全部数据,却在循环内重置全局列表,直接清空之前保存的数据:
python target_file = [] for folder in ["f1","f2"]: # ❌ 错误:循环内重置全局列表,直接清空过往所有文件数据 target_file = [] target_file.append("demo.txt") print(target_file) # 仅 ['demo.txt'],f1文件夹数据彻底丢失 |
二、同类四大经典循环变量踩坑汇总
这个坑不只是列表独有,字典、数字变量、字符串都会出现,属于Python循环通用易错点。
坑1:列表循环内初始化,历史分组数据丢失
python # 需求:分组收集每轮数字,汇总全部分组 res = [] for i in range(3): tmp = [] # 每次循环新建空列表,清空上一轮数据 tmp.append(i) res.append(tmp) print(tmp) # 循环结束 tmp=[2],无法获取全部数据 |
坑2:字典循环内赋值,旧分组键值被覆盖
python # 需求:存储每个人得分 total = {} for name in ["A","B"]: info = {} # 每轮新建空字典,清空上一组信息 info["score"] = 10 total[name] = info print(info) # 仅保留最后一个B的信息 |
坑3:数值计数循环内重置,样本统计永久失效
python # 需求:统计当前文件夹文件总数 count = 0 for f in os.listdir("./"): count = 0 # 每轮重置计数,最终统计结果永远为0 count +=1 print(count) |
坑4:字符串循环内赋值,文本拼接数据截断
python # 需求:拼接多个文件文本内容 content = "" for file in ["1.txt","2.txt"]: content = "" # 每轮清空字符串,之前内容失效 content += "数据" print(content) # 只输出最后一次赋值内容 |
三、完整可运行实战示例
python import os # 模拟本地目录:folder1、folder2 两个子文件夹 # 1.分组结果容器 2.全局合并容器,全部外置初始化 group_result = [] total_target_file = [] # 遍历分类文件夹 sub_folders = ["folder1", "folder2"] for folder in sub_folders: # 单文件夹临时列表,本轮迭代专属 temp_list = [] # 模拟文件夹内存量文件 files = ["1_target.txt", "2.jpg", "3_target.txt"] for file in files: if file.endswith("_target.txt"): temp_list.append(file) # 保存分组数据 group_result.append(temp_list) # 合并至全局总数据 total_target_file.extend(temp_list) print("各文件夹分组结果:", group_result) print("全局合并所有目标文件:", total_target_file) # ❌ 错误校验:print(temp_list) 只会输出最后一个文件夹数据 |