如何自动重命名从 pytube 下载的文件?
How do I rename the downloaded file from pytube automatically?
我是 Python 的新手,过去只用过 PHP 5(很多年前的现在)。作为一个初学者项目,我想我会使用 pytube 制作一个 YouTube 下载器,让您选择是下载最高质量的视频还是仅下载音频作为 .mp3。
好吧,我卡在了最后一部分:将扩展名更改为 .mp3。
我想要一个我能理解的简单而优雅的解决方案,但我们将不胜感激。
我试过使用 os.rename() 但不确定如何让它发挥作用。
from pytube import YouTube
import os
yt = YouTube(str(input("Enter the URL of the video you want to download: \n>> ")))
print("Select download format:")
print("1: Video file with audio (.mp4)")
print("2: Audio only (.mp3)")
media_type = input()
if media_type == "1":
video = yt.streams.first()
elif media_type == "2":
video = yt.streams.filter(only_audio = True).first()
else:
print("Invalid selection.")
print("Enter the destination (leave blank for current directory)")
destination = str(input(">> "))
video.download(output_path = destination)
if media_type == "2":
os.rename(yt.title + ".mp4", yt.title + ".mp3")
print(yt.title + "\nHas been successfully downloaded.")
编辑:
昨天试的时候卡在了最后一部分,但我又试了一段时间后,我得到了这个错误信息:
Traceback (most recent call last):
File "Tubey.py", line 42, in <module>
os.rename(yt.title + ".mp4", yt.title + ".mp3")
FileNotFoundError: [WinError 2] The system cannot find the file specified: "Cristobal Tapia de veer - DIRK GENTLY's original score sampler - cut 3.mp4" -> "Cristobal Tapia de veer - DIRK GENTLY's original score sampler - cut 3.mp3"
文件已下载但未重命名。
最终编辑:(可能)
我终于让它工作了,这主要归功于 J_H。谢谢你容忍我的无能,你是圣人。
这是最终解决问题的完整代码(以防将来遇到类似问题的其他人遇到类似问题):
from pytube import YouTube
import os
yt = YouTube(str(input("Enter the URL of the video you want to download: \n>> ")))
print("Select download format:")
print("1: Video file with audio (.mp4)")
print("2: Audio only (.mp3)")
media_type = input(">> ")
if media_type == "1":
video = yt.streams.first()
elif media_type == "2":
video = yt.streams.filter(only_audio = True).first()
else:
print("Invalid selection.")
print("Enter the destination (leave blank for current directory)")
destination = str(input(">> ")) or '.'
out_file = video.download(output_path = destination)
if media_type == "2":
base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)
print(yt.title + " has been successfully downloaded.")
我打算把它变成一个长期项目,并随着我学得越多,扩展脚本的功能越多,但现在我很满意。再次感谢。
看起来您的代码只有在用户输入以尾部斜杠结尾时才能正常工作。
使用os.path.join()
组合目标目录和文件名。
使用这个表达式默认为空为.
,当前目录:
destination = str(input(">> ")) or '.'
编辑:
我希望您的假设是正确的,即我们可以从标题预测输出文件规范。
但不是。
例如,yt = YouTube('https://www.youtube.com/watch?v=9bZkp7q19f0')
获取标题以 'M/V'
结尾的 PSY 音乐视频。
然而 .download()
将(相当合理地)构造一个仅包含 'MV'
且没有斜线的文件名。
您不应该试图预测输出文件规范。
相反,您应该存储 .download()
中的 return 值,
所以您会肯定知道正确的文件规范是什么。
这是将输出重命名为常量文件名的示例:
>>> out_file = yt.streams.first().download()
>>> os.rename(out_file, 'new.mp3')
>>>
或者,如果您愿意,可以将其重命名为 os.path.join('/tmp', 'new.mp3')
。
您可能还希望使用 splitext
:
解析扩展名
base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)
您可能会发现 only_audio
标志是减少视频占用带宽的便捷方式,
如果您只想获取音轨:
yt.streams.filter(only_audio=True).all()
2021 年编辑:
您不必使用 os
,
您现在可以使用:
video.download(output_path=destination, filename=input("Enter file name (without extension): "))
我是 Python 的新手,过去只用过 PHP 5(很多年前的现在)。作为一个初学者项目,我想我会使用 pytube 制作一个 YouTube 下载器,让您选择是下载最高质量的视频还是仅下载音频作为 .mp3。
好吧,我卡在了最后一部分:将扩展名更改为 .mp3。
我想要一个我能理解的简单而优雅的解决方案,但我们将不胜感激。
我试过使用 os.rename() 但不确定如何让它发挥作用。
from pytube import YouTube
import os
yt = YouTube(str(input("Enter the URL of the video you want to download: \n>> ")))
print("Select download format:")
print("1: Video file with audio (.mp4)")
print("2: Audio only (.mp3)")
media_type = input()
if media_type == "1":
video = yt.streams.first()
elif media_type == "2":
video = yt.streams.filter(only_audio = True).first()
else:
print("Invalid selection.")
print("Enter the destination (leave blank for current directory)")
destination = str(input(">> "))
video.download(output_path = destination)
if media_type == "2":
os.rename(yt.title + ".mp4", yt.title + ".mp3")
print(yt.title + "\nHas been successfully downloaded.")
编辑:
昨天试的时候卡在了最后一部分,但我又试了一段时间后,我得到了这个错误信息:
Traceback (most recent call last):
File "Tubey.py", line 42, in <module>
os.rename(yt.title + ".mp4", yt.title + ".mp3")
FileNotFoundError: [WinError 2] The system cannot find the file specified: "Cristobal Tapia de veer - DIRK GENTLY's original score sampler - cut 3.mp4" -> "Cristobal Tapia de veer - DIRK GENTLY's original score sampler - cut 3.mp3"
文件已下载但未重命名。
最终编辑:(可能)
我终于让它工作了,这主要归功于 J_H。谢谢你容忍我的无能,你是圣人。 这是最终解决问题的完整代码(以防将来遇到类似问题的其他人遇到类似问题):
from pytube import YouTube
import os
yt = YouTube(str(input("Enter the URL of the video you want to download: \n>> ")))
print("Select download format:")
print("1: Video file with audio (.mp4)")
print("2: Audio only (.mp3)")
media_type = input(">> ")
if media_type == "1":
video = yt.streams.first()
elif media_type == "2":
video = yt.streams.filter(only_audio = True).first()
else:
print("Invalid selection.")
print("Enter the destination (leave blank for current directory)")
destination = str(input(">> ")) or '.'
out_file = video.download(output_path = destination)
if media_type == "2":
base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)
print(yt.title + " has been successfully downloaded.")
我打算把它变成一个长期项目,并随着我学得越多,扩展脚本的功能越多,但现在我很满意。再次感谢。
看起来您的代码只有在用户输入以尾部斜杠结尾时才能正常工作。
使用os.path.join()
组合目标目录和文件名。
使用这个表达式默认为空为.
,当前目录:
destination = str(input(">> ")) or '.'
编辑:
我希望您的假设是正确的,即我们可以从标题预测输出文件规范。
但不是。
例如,yt = YouTube('https://www.youtube.com/watch?v=9bZkp7q19f0')
获取标题以 'M/V'
结尾的 PSY 音乐视频。
然而 .download()
将(相当合理地)构造一个仅包含 'MV'
且没有斜线的文件名。
您不应该试图预测输出文件规范。
相反,您应该存储 .download()
中的 return 值,
所以您会肯定知道正确的文件规范是什么。
这是将输出重命名为常量文件名的示例:
>>> out_file = yt.streams.first().download()
>>> os.rename(out_file, 'new.mp3')
>>>
或者,如果您愿意,可以将其重命名为 os.path.join('/tmp', 'new.mp3')
。
您可能还希望使用 splitext
:
base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)
您可能会发现 only_audio
标志是减少视频占用带宽的便捷方式,
如果您只想获取音轨:
yt.streams.filter(only_audio=True).all()
2021 年编辑:
您不必使用 os
,
您现在可以使用:
video.download(output_path=destination, filename=input("Enter file name (without extension): "))