Python 如何自动重命名从pytube下载的文件?

Python 如何自动重命名从pytube下载的文件?,python,python-3.x,rename,pytube,Python,Python 3.x,Rename,Pytube,我是Python新手,过去(很多年前现在)只使用过PHP5。作为一个初学者项目,我想我应该使用pytube制作一个YouTube下载程序,让你选择是下载最高质量的视频还是只下载.mp3格式的音频 我被最后一部分卡住了:把分机改成.mp3 我想要一个简单而优雅的解决方案,我可以理解,但任何帮助将不胜感激 我尝试使用os.rename(),但不确定如何使其工作 from pytube import YouTube import os yt = YouTube(str(input("Enter th

我是Python新手,过去(很多年前现在)只使用过PHP5。作为一个初学者项目,我想我应该使用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"

我打算把这变成一个长期的项目,并用更多的功能扩展脚本,我学的越多,但现在我很满意。再次感谢。

看起来您的代码只有在用户输入以斜杠结尾时才能正常工作

用于将目标目录与文件名合并。 使用此表达式将当前目录的默认值设置为空:

destination = str(input(">> ")) or '.'
编辑:

我希望您的假设是正确的,即我们可以根据标题预测输出文件规格。 但是没有。 例如,
yt=YouTube('https://www.youtube.com/watch?v=9bZkp7q19f0)
获取标题以
'M/V'
结尾的PSY音乐视频。 然而,
.download()
将(相当合理地)构造一个只包含
'MV'
的文件名,没有斜杠

您不应该试图预测输出文件规格。 相反,您应该存储
.download()
中的返回值, 因此,您肯定知道正确的文件规范是什么。 以下是将输出重命名为常量文件名的示例:

>>> out_file = yt.streams.first().download()
>>> os.rename(out_file, 'new.mp3')
>>>
或者,如果愿意,可以将其重命名为
os.path.join('/tmp',new.mp3')

您可能还希望使用以下方法解析扩展:

您可能会发现,
only_audio
标志是一种减少视频占用带宽的便捷方式, 如果您希望只获取音频曲目:

yt.streams.filter(only_audio=True).all()
编辑2021:

您不必使用
os
, 您现在可以使用:

video.download(output_path=destination, filename=input("Enter file name (without extension): "))

您当前的解决方案有什么问题?现在我终于得到了一条错误消息,添加了错误消息。但简而言之,该文件已下载,但找不到指定的文件,因此扩展名不会更改。我不习惯pytube,但我的印象是,当您选择仅下载音频时,库将自动将其设置为“.mp3”文件。但是,请稍候!我突然想到,有些视频没有mp3音频曲目。他们可以使用另一种格式。阅读文档后,我发现您可以使用
yt.streams.filter(文件扩展名为'mp4')
查询特定格式的曲目,看看是否有可用的曲目。我测试的任何视频中都没有mp3曲目。但不管怎样,我很好奇为什么它说在试图重命名它时找不到指定的文件。我尝试用os.rename()更改其中的行以包括目标,但我得到了相同的错误(这次只包括我输入的路径,如果留空则没有)。我认为你是对的。但我在尝试你的建议,显然我做错了什么。在我的例子中,你能告诉我如何使用
os.path.join()
来完成这个任务吗?我试着定义一个包含
os.path.join(destination,yt.title)
的函数,并将它变成一个变量,插入到
os.rename()
函数中,但这两个函数都不起作用,但我很确定我自己的无能是罪魁祸首。为了让它起作用,我不得不花了一段时间摆弄它,但我最终还是做到了。非常感谢你的帮助。我已经编辑了原始的文章,使用了使其工作的确切代码,以供将来参考。干杯
yt.streams.filter(only_audio=True).all()
video.download(output_path=destination, filename=input("Enter file name (without extension): "))