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

使用PyTube下载视频时持续触发FileNotFoundError问题求助

PyTube下载YouTube视频触发FileNotFoundError问题排查

之前使用PyTube下载YouTube视频一切正常,近期每次尝试下载时都会触发如下错误:

FileNotFoundError: [Errno 2] No such file or directory:

以下是相关代码:

def vid_only():
    for stream in yt.streams.filter(only_video=True, adaptive=True, file_extension="mp4"):
        res_avail.add((stream.resolution))
    r = ", ".join(res_avail)
    print(f"Available resolutions:  {r}")

    res_choose = input("Input your desired resolution: ")
    print("Downloading . . .")
    vid_download = yt.streams.filter(res=res_choose.lower()).first()
    vid_download.download(filename=yt.title + " VIDEO ONLY.mp4")

link = input("Input youtube link: ")
yt = YouTube(link)
res_avail = set()
stream_type = int(input("Types: \n1. Video only \n2. Audio only \n3. Video with audio \nEnter the number of the type you want to download: "))

if stream_type == 1:
    vid_only()

用户疑问:是不是这行代码存在问题?

vid_download.download(filename=yt.title + " VIDEO ONLY.mp4")

问题原因

这行代码确实是主要诱因,核心问题在于:

  • YouTube视频标题可能包含操作系统不允许的文件名字符(比如Windows下的/ \ : * ? " < > |,Linux/macOS下的/),直接用yt.title拼接文件名时,这些非法字符会导致系统无法识别有效路径,从而触发FileNotFoundError。
  • 少数情况下,如果当前工作目录没有写入权限,也会引发同样的错误。

解决方案

  1. 清理标题中的非法字符
    编写一个简单的函数过滤掉标题里的无效字符:

    def clean_filename(filename):
        # 列出所有系统禁止的文件名字符
        invalid_chars = '<>:"/\\|?*'
        for char in invalid_chars:
            filename = filename.replace(char, '')
        return filename
    

    修改下载代码行:

    cleaned_title = clean_filename(yt.title)
    vid_download.download(filename=f"{cleaned_title} VIDEO ONLY.mp4")
    
  2. 指定明确的下载路径
    如果当前工作目录没有写入权限,或者你想指定保存位置,直接添加output_path参数:

    # 示例:Windows路径
    vid_download.download(output_path="C:/Users/YourName/Downloads", filename=f"{cleaned_title} VIDEO ONLY.mp4")
    # 示例:Linux/macOS路径
    vid_download.download(output_path="/home/YourName/Downloads", filename=f"{cleaned_title} VIDEO ONLY.mp4")
    
  3. 优化分辨率匹配逻辑
    避免用户输入格式错误导致vid_download为None(虽然这会引发AttributeError而非当前的FileNotFound,但可以提升代码健壮性):

    res_choose = input("Input your desired resolution: ").strip()
    # 确保输入格式和可选分辨率一致(比如统一为小写)
    vid_download = yt.streams.filter(res=res_choose.lower()).first()
    if not vid_download:
        print(f"Resolution {res_choose} is not available!")
        return
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:30:48