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

Python循环批量下载视频仅首个生效,其余文件为空求助

批量下载视频仅第一个成功,后续文件为空的解决方案

我帮你分析了代码里的几个核心问题,这些就是导致后续下载空文件的根源,下面是修复方案和详细解释:

问题分析

  1. 文件变量名冲突:你在外层用了with open('download.txt') as f,内层又用with open(filename, 'wb') as f,这会直接覆盖外层的文件对象。虽然readlines()已经把内容读到内存,但这种写法很容易引发意外问题,比如后续循环中文件句柄被错误关闭。
  2. URL携带无效字符:readlines()返回的每一行末尾会自带换行符\n,直接把line赋值给url会让请求的URL带上这个换行符,服务器无法识别,自然返回空内容或者错误响应。
  3. 文件名生成逻辑错误:name变量在循环外初始化,第一次循环后变成video1,第二次就会变成video12,第三次video123,这不是你想要的按顺序命名的文件名,虽然这不是空文件的直接原因,但也是需要修复的bug。
  4. 未正确处理流式下载:你代码中写入文件的部分省略了,如果没有通过iter_content()分块读取响应内容并写入,文件自然会是空的。

修复后的完整代码

import requests

def download():
    base_name = 'video'
    with open('download.txt') as file_in:
        # 用enumerate获取循环索引,从1开始计数
        for idx, line in enumerate(file_in, start=1):
            # 去除行首尾的空白字符(包括换行符、空格)
            url = line.strip()
            # 跳过空行,避免无效请求
            if not url:
                continue
            
            try:
                # 发起流式请求,适合大文件下载
                response = requests.get(url, stream=True)
                # 检查请求是否成功,失败则抛出异常
                response.raise_for_status()
                
                # 生成规范的文件名:video1.mp4、video2.mp4...
                filename = f"{base_name}{idx}.mp4"
                with open(filename, 'wb') as file_out:
                    # 分块写入内容,chunk_size可根据网络情况调整
                    for chunk in response.iter_content(chunk_size=8192):
                        if chunk:  # 过滤空块,避免写入无效内容
                            file_out.write(chunk)
                print(f"✅ 成功下载:{filename}")
            except Exception as e:
                print(f"❌ 下载链接 {url} 失败:{str(e)}")

if __name__ == "__main__":
    download()

关键修复点说明

  • 避免变量名冲突:把外层文件变量改成file_in,内层改成file_out,彻底解决句柄覆盖的问题。
  • 清理URL格式:line.strip()确保URL没有多余的换行符和空格,保证请求的是正确的地址。
  • 规范文件名生成:用enumerate直接获取循环的序号,结合基础文件名生成有序的文件名,逻辑更清晰。
  • 异常处理:添加try-except块捕获请求和写入时的错误,方便排查哪个链接出了问题,不会因为一个链接失败导致整个循环终止。
  • 正确流式写入:通过response.iter_content()分块读取大文件内容,既节省内存,又能确保内容完整写入文件。
  • 请求状态检查:response.raise_for_status()会在请求返回4xx/5xx错误时抛出异常,及时发现无效链接或者服务器错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:45:51