Python使用pytube模块获取YouTube视频大小提示无filesize属性报错
pytube 读取文件大小报错解决方法
报错原因
filesize属性不属于YouTube根实例,而是绑定在单条视频流Stream对象上。一个YouTube视频会提供多套不同分辨率、编码、音轨配置的下载流,每套流的体积完全不同,因此不存在全局统一的文件大小属性。- 你直接调用
video_link.filesize自然会触发属性不存在的错误。
修正方案
你需要先选定要操作的具体流,再从流对象上读取filesize属性,同时你原代码还有两处逻辑错误需要调整:
- 进度回调需要在调用下载方法前注册,且要传入函数本身,不能直接执行函数
streams.first()的返回规则不明确,推荐用get_highest_resolution()等方法明确指定要使用的流
修正后完整代码
from tkinter import * from pytube import * import tkinter.messagebox as tmsg # 进度回调函数 def on_progress(stream, chunk, bytes_remaining): total = stream.filesize downloaded = total - bytes_remaining print(f"下载进度:{round(downloaded / total * 100, 1)}%") video_link = YouTube("https://www.youtube.com/watch?v=vvpb8IdDZZI&t=187s") print(f"视频标题:{video_link.title}") # 选择最高分辨率的视频流 target_stream = video_link.streams.get_highest_resolution() # 打印文件大小,单位转换为MB print(f"视频大小:{round(target_stream.filesize / 1024 / 1024, 2)} MB") # 注册进度回调 video_link.register_on_progress_callback(on_progress) # 执行下载 target_stream.download() print("视频下载完成")
可选操作:查看所有流的大小
如果需要遍历所有可选下载流的大小,可使用如下代码:
for stream in video_link.streams: print(f"流配置:{stream} | 体积:{stream.filesize if stream.filesize else '无数据'} 字节")
内容的提问来源于stack exchange,提问作者Sajal Rawat
相关产品推荐
相关产品推荐

