循环下载CSV文件时仅获取列表最后一个URL内容的问题求助
解决你的循环与文件保存问题
嘿,我来帮你捋捋这个问题~你的脚本现在只保留了最后一个URL的内容,主要是循环逻辑和文件操作的几个小问题导致的,咱们一步步修正:
先说说你的代码里的核心问题
- 多余的嵌套循环:你嵌套了
jobboard_names和files_names的循环,但其实jobboard_name被你重新赋值成了请求响应,这个循环完全没必要——它会让同一个URL被重复请求多次,最后每次都覆盖文件内容,自然只剩最后一次的结果。 - 文件覆盖风险:如果
files_names里是重复的文件名,或者你没给每个URL分配唯一的文件,后面的写入会直接覆盖前面的内容。 - 变量名混乱:把循环变量
jobboard_name用来存请求响应,容易搞混逻辑,换个清晰的名字比如response会好很多。 - 文件未正确关闭:直接用
open()后没调用close(),容易导致资源泄漏,推荐用with语句自动管理。 - 目录未提前创建:使用
os.replace前如果日期目录不存在,会直接报错。
修改后的代码(适配常见需求)
假设你的需求是:每个URL对应一个文件,从files_names里取对应文件名,最终保存到日期目录下(要求urls和files_names长度一致):
import os import requests from datetime import datetime today = datetime.today() # 先创建日期目录,不存在就新建 date_dir = today.strftime('%d-%m-%Y') if not os.path.exists(date_dir): os.makedirs(date_dir) # 示例的urls和files_names(替换成你自己的) urls = ["https://example.com/board1", "https://example.com/board2", "https://example.com/board3"] files_names = ["board1.csv", "board2.csv", "board3.csv"] # 用zip把URL和对应的文件名配对遍历,确保一一对应 for url, file_name in zip(urls, files_names): # 发送请求 response = requests.get(url) # 先检查请求是否成功 if response.status_code == 200: # 用with语句打开文件,自动关闭,更安全 with open(file_name, "wb") as file: file.write(response.content) # 拼接目标路径,避免路径错误 dest_path = os.path.join(date_dir, file_name) # 如果目标文件已存在,先删除(根据需求可选) if os.path.exists(dest_path): os.remove(dest_path) # 移动文件到日期目录 os.replace(file_name, dest_path) else: print(f"请求URL {url} 失败,状态码:{response.status_code}")
如果你不需要预先定义文件名
要是你想给每个URL自动生成唯一文件名(不用files_names列表),可以改成这样:
import os import requests from datetime import datetime today = datetime.today() date_dir = today.strftime('%d-%m-%Y') if not os.path.exists(date_dir): os.makedirs(date_dir) urls = ["https://example.com/board1", "https://example.com/board2", "https://example.com/board3"] # 用enumerate获取索引,给每个URL生成唯一文件名 for idx, url in enumerate(urls): response = requests.get(url) if response.status_code == 200: # 用索引做文件名后缀,避免重复 file_name = f"jobboard_{idx+1}.csv" with open(file_name, "wb") as file: file.write(response.content) dest_path = os.path.join(date_dir, file_name) if os.path.exists(dest_path): os.remove(dest_path) os.replace(file_name, dest_path) else: print(f"处理第 {idx+1} 个URL {url} 时失败")
关键修改点总结
- 去掉了多余的
jobboard_names循环,简化逻辑; - 用
zip或enumerate确保每个URL对应唯一的文件,避免覆盖; - 提前创建日期目录,防止报错;
- 用
with语句管理文件,自动关闭; - 加入请求状态码判断,方便排查问题。
内容的提问来源于stack exchange,提问作者drop
相关产品推荐
相关产品推荐

