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

Python读取txt内URL批量下载文件自动按序命名存储报错排查

报错原因排查

你的报错核心是URL读取逻辑错误:

  • 你写的(line.strip()).split()会把每行的单个URL字符串转成单元素列表,多余的split()调用是核心错误,最终得到的list_of_urls是嵌套列表结构,每个元素格式为['https://xxx.nc'],而非requests可识别的纯URL字符串
  • requests传入列表类型的URL时无法匹配对应的连接适配器,就会抛出你看到的报错。
优化实现思路

要实现读取txt内URL、自动命名、指定路径保存的需求,按以下逻辑改造即可:

  • 读取txt时直接取每行去除首尾空白后的纯字符串,过滤空行,不做多余split操作
  • 提前配置文件保存目录,代码自动判断目录是否存在,不存在则自动创建,避免路径不存在报错
  • 可根据需求选择命名规则:要么提取URL自带的文件名,要么按下载时间生成有序文件名;若需要按时间顺序下载,可先对URL列表按内嵌的时间字段(比如你示例URL里的年份)排序后再执行下载
  • 下载逻辑增加状态码校验、超时设置,提升稳定性。
完整可运行代码
import requests
import os
from datetime import datetime

# -------------------------- 配置项 按需修改 --------------------------
URL_TXT_PATH = r'C:\Users\HBI8\Downloads\testing.txt'  # 存储URL的txt文件路径
SAVE_FOLDER = r'C:\Users\HBI8\Downloads\met_data'      # 下载文件保存的目标文件夹
TIME_SORT_URL = True                                   # 是否按URL内嵌的年份/时间排序后下载
NAME_WITH_DOWNLOAD_TIME = False                        # 文件名是否带下载时间戳,False则保留URL自带的原文件名
# --------------------------------------------------------------------

def download_url(url: str, save_path: str):
    """单文件下载函数"""
    try:
        # 加30秒超时避免无响应卡住,加状态码校验,HTTP错误直接抛异常
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        with open(save_path, 'wb') as f:
            f.write(r.content)
        print(f"下载成功: {save_path}")
    except Exception as e:
        print(f"下载失败 {url}: {str(e)}")

if __name__ == '__main__':
    # 自动创建保存文件夹,已存在也不会报错
    os.makedirs(SAVE_FOLDER, exist_ok=True)

    # 从txt读取所有URL,自动过滤空行
    with open(URL_TXT_PATH, 'r', encoding='utf-8') as f:
        url_list = [line.strip() for line in f if line.strip()]
    
    # 按需对URL按时间排序(适配示例里带年份的URL格式,其他格式可自行调整排序规则)
    if TIME_SORT_URL:
        # 提取URL文件名里的4位年份数字,按升序排列,即从最早年份到最晚年份下载
        url_list.sort(key=lambda x: int(''.join([c for c in x.split('/')[-1] if c.isdigit()][:4])))

    # 遍历URL逐个下载,自动生成保存路径
    for idx, url in enumerate(url_list):
        # 生成文件名
        if NAME_WITH_DOWNLOAD_TIME:
            # 带下载时间的命名格式: 3位序号_下载时间_原文件名,文件夹内自动按下载顺序排序
            download_time = datetime.now().strftime('%Y%m%d_%H%M%S')
            original_filename = url.split('/')[-1]
            file_name = f"{idx+1:03d}_{download_time}_{original_filename}"
        else:
            # 直接用URL自带的原文件名
            file_name = url.split('/')[-1]
        # 拼接完整保存路径,自动适配Windows/macOS/Linux路径格式
        full_save_path = os.path.join(SAVE_FOLDER, file_name)
        # 执行下载
        download_url(url, full_save_path)
代码使用说明
  • 把顶部配置项里的路径改成你自己的实际路径即可直接运行
  • 如果你需要下载的文件在文件夹里按时间先后排序展示,把NAME_WITH_DOWNLOAD_TIME设为True即可
  • 如果你的URL不是带4位年份的格式,调整排序规则里的lambda函数即可适配其他时间格式
  • 代码用with open读写文件会自动关闭文件句柄,不需要手动写close,更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:33:26