使用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。 - 少数情况下,如果当前工作目录没有写入权限,也会引发同样的错误。
解决方案
清理标题中的非法字符
编写一个简单的函数过滤掉标题里的无效字符: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")指定明确的下载路径
如果当前工作目录没有写入权限,或者你想指定保存位置,直接添加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")优化分辨率匹配逻辑
避免用户输入格式错误导致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
相关产品推荐
相关产品推荐

