Python嵌套循环问题:如何循环复用JSON文件分批次处理urls.txt
现有代码的核心问题
- 外层循环使用
for j in range(0, itr_length)遍历JSON文件,本身就是固定跑完一轮就终止的逻辑,没有设置索引归零的分支,自然会在遍历完所有JSON后退出流程 - 在
j == itr_length-1的判断分支里直接触发return,会跳出整个UrlCall函数,根本没有后续处理剩余URL的逻辑 - 行读取逻辑存在偏差:
readlines(20)的入参是最大读取字节数,不是按行数读取,没法精准控制每100行切换JSON的规则 - 嵌套循环层级混乱,把计数切批次、JSON切换、函数退出的逻辑全部耦合在一起,没有做模块化解耦
优化实现方案
核心思路是把「JSON循环复用」和「按固定批次切分URL」两个独立逻辑拆开实现,完全避免手写冗余的索引重置判断:
- 调用标准库
itertools.cycle生成JSON文件的无限迭代器,遍历完一轮后自动回到列表开头的第一个文件,不需要手动写循环重置代码 - 预先按行读取urls.txt内容,之后按每100行切分为独立的URL批次,每个批次对应从迭代器取一个当前要使用的JSON文件
- 移除提前触发的
return逻辑,当所有URL批次处理完成后循环自然结束
import glob import time from itertools import cycle # 配置参数 batch_size = 100 JSON_KEY_FILE_PATH = "json_files/" JSON_FILENAME = '*.json' # 加载指定路径下的所有JSON文件 json_file_list = glob.glob(JSON_KEY_FILE_PATH + JSON_FILENAME, recursive=True) if not json_file_list: raise FileNotFoundError("指定路径下未找到任何匹配的JSON文件") # 生成无限循环的JSON迭代器,自动实现用完一轮从头复用的效果 json_cycle = cycle(json_file_list) def UrlCall(URL_FILE): # 一次性按行读取所有URL,过滤掉空行,避免逐行读取的效率损耗 with open(URL_FILE, mode='r', encoding='utf-8') as f: all_url_lines = [line.strip() for line in f if line.strip()] # 按固定批次大小切分URL列表 for batch_start in range(0, len(all_url_lines), batch_size): current_url_batch = all_url_lines[batch_start: batch_start + batch_size] # 每个批次自动取下一个循环到的JSON文件 current_json = next(json_cycle) print(f"===== 开始处理第 {batch_start//batch_size + 1} 个URL批次 =====") print(f"当前使用JSON配置文件: {current_json}") print(f"本批次待处理URL数量: {len(current_url_batch)}") # 在此处插入实际用指定JSON处理单条URL的业务逻辑 for url in current_url_batch: # process_url_with_config(url, current_json) pass # 可根据业务需要设置批次处理间隙的等待时间 time.sleep(1)
效果校验
以5个JSON文件、总共1250条URL的场景为例:
- 前100行使用1.json处理,接下来100行依次用2.json、3.json、4.json、5.json
- 第501-600行会自动切回1.json配置,完全匹配“所有JSON用完一轮后从头复用”的要求
- 整个流程不会在JSON遍历完一轮后提前退出,会持续处理直到所有URL行完成运算
内容的提问来源于stack exchange,提问作者Ankit Verma
相关产品推荐
相关产品推荐

