嵌套循环生成URL列表异常:仅处理首个国家的问题排查
问题原因与修复方案
问题根源
你的代码里start_date变量在处理第一个国家(france)的循环中被持续累加,当处理完france的所有日期后,start_date已经变成2019-04-06,超过了设定的end_date(2019-04-05)。后续处理germany和spain时,while start_date <= end_date的条件不成立,内部的日期、小时循环完全不会执行,所以最终列表里只有france的URL。
修复方案
有两种简单的修复方式:
方式一:每次处理新国家时重置起始日期
把start_date的初始化移到国家循环内部,确保每个国家都从初始日期开始遍历:
import datetime end_date = datetime.date(2019, 4, 5) delta = datetime.timedelta(days=1) list_of_urls = [] list_of_countries = ['france', 'germany', 'spain'] for country in list_of_countries: # 每个国家处理前重置起始日期 start_date = datetime.date(2019, 4, 4) while start_date <= end_date: for hour in range(24): # 用f-string拼接URL更简洁 url = f'https://thewebsite.com/{country}/{start_date.strftime("%Y-%m-%d")}/{hour}/' list_of_urls.append(url) start_date += delta print(list_of_urls)
方式二:预先生成所有日期列表
先把需要处理的日期一次性生成好,再遍历日期列表,避免修改原始起始日期变量:
import datetime start_date = datetime.date(2019, 4, 4) end_date = datetime.date(2019, 4, 5) delta = datetime.timedelta(days=1) # 预先生成所有要处理的日期 dates = [] current_date = start_date while current_date <= end_date: dates.append(current_date) current_date += delta list_of_urls = [] list_of_countries = ['france', 'germany', 'spain'] for country in list_of_countries: for date in dates: for hour in range(24): url = f'https://thewebsite.com/{country}/{date.strftime("%Y-%m-%d")}/{hour}/' list_of_urls.append(url) print(list_of_urls)
两种方式都能让三个国家的所有日期、小时对应的URL都被生成,第二种方式的逻辑更清晰,也不容易出现变量修改导致的问题。
内容的提问来源于stack exchange,提问作者user19783276
相关产品推荐
相关产品推荐

