You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3实现从数组批量下载文件并保存到指定目录问题求助

代码问题修复方案

你原代码存在以下几个核心错误,对应修改即可正常运行:

  • 变量名不匹配:循环内发起下载请求返回的响应对象命名为r,但写入文件时调用了未定义的downloadedfile.content,运行会直接报变量不存在的错误
  • 文件名生成逻辑错误:你直接用响应对象r拼接保存路径,最终生成的文件名会是Python对象的内存地址字符串,完全不符合预期,需要从下载链接中提取真实的压缩包文件名
  • 流式下载未合理利用:开启stream=True参数后没有按块写入文件,下载大文件时会占用过高内存
  • 资源管理逻辑不完善:手动调用open/close操作文件,如果写入过程中报错会导致文件资源泄露,建议使用with上下文管理器自动处理资源释放
修正后可直接运行的代码
import requests
from bs4 import BeautifulSoup as bs
import os

# 配置参数:修改为你自己的本地下载目录
save_dir = "/Users/iga0779/Downloads"
# 如果目录不存在自动创建
os.makedirs(save_dir, exist_ok=True)

# 请求NGA站点获取压缩包列表
r = requests.get('https://earth-info.nga.mil/index.php?dir=coordsys&action=gars-20x20-dloads', timeout=30)
soup = bs(r.content, 'html.parser')
files = ['https://earth-info.nga.mil/' + i['href'] for i in soup.select('area')]

# 批量下载文件
for file_url in files:
    # 从url中提取真实文件名
    file_name = file_url.split("/")[-1]
    save_path = os.path.join(save_dir, file_name)
    
    # 发起下载请求
    print(f"开始下载:{file_name}")
    download_r = requests.get(file_url, stream=True, timeout=30)
    
    # 流式写入文件
    with open(save_path, 'wb') as f:
        for chunk in download_r.iter_content(chunk_size=1024*1024):
            if chunk:
                f.write(chunk)
    print(f"下载完成:{save_path}")
补充说明
  • 你原代码里导入的zipfile库没有用到,如果不需要后续自动解压可以删掉该导入语句
  • 代码里设置了30秒超时,避免网络异常时请求长时间卡住
  • iter_content按1MB块写入,适合大文件下载,内存占用更低
  • os.path.join用来拼接路径,兼容Windows、macOS、Linux不同系统的路径格式

内容的提问来源于stack exchange,提问作者Ismail Gaddipati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:06:04