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

使用Pytube下载带序号命名的YouTube播放列表报错求助

问题分析与解决

报错原因拆解

  1. 第一个报错(FileNotFoundError)
    视频被下载到了folder_name指定的目录,但执行os.rename时用的是相对文件名,而脚本当前的工作目录不是下载目录,导致系统找不到要重命名的文件。

  2. 第二个报错(WinError 123)
    Windows系统文件名不允许包含\/:*?"<>|这些字符,你生成的新文件名里带有?和:,违反了命名规则,因此重命名失败。

修复后的代码

直接在下载阶段就指定带序号的合法文件名,无需事后重命名,一步解决所有问题:

from pytube import Playlist
from tkinter import filedialog
import os

def clean_filename(filename):
    # 移除Windows文件名禁止的字符
    forbidden_chars = '<>:"/\\|?*'
    for char in forbidden_chars:
        filename = filename.replace(char, '')
    return filename

playlist = Playlist(input("输入播放列表链接:\n"))
folder_name = filedialog.askdirectory()
print("播放列表总视频数:", len(playlist.video_urls))

for idx, video in enumerate(playlist.videos, start=1):
    # 获取360p流对象,避免重复查找
    stream = video.streams.get_by_resolution('360p')
    if not stream:
        print(f"视频 {video.title} 找不到360p流,跳过")
        continue
    # 清理标题里的非法字符,拼接序号和后缀
    cleaned_title = clean_filename(video.title)
    new_filename = f"{idx}_{cleaned_title}.mp4"
    # 下载时直接指定输出路径和文件名
    stream.download(output_path=folder_name, filename=new_filename)
    print(f"已下载: {new_filename}")

关键优化点

  • 解决路径问题:下载时直接指定output_path和filename,彻底规避事后重命名的路径匹配问题。
  • 清理非法字符:通过clean_filename函数移除Windows禁用的特殊字符,避免命名报错。
  • 复用流对象:提前获取视频流对象,避免重复调用get_by_resolution,提升运行效率。
  • 增加容错判断:检查目标分辨率流是否存在,避免因部分视频无对应分辨率导致程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:15:32