使用Pytube下载带序号命名的YouTube播放列表报错求助
问题分析与解决
报错原因拆解
第一个报错(FileNotFoundError)
视频被下载到了folder_name指定的目录,但执行os.rename时用的是相对文件名,而脚本当前的工作目录不是下载目录,导致系统找不到要重命名的文件。第二个报错(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
相关产品推荐
相关产品推荐

