3

更好地学习和理解 Python 我想编写一个基于 youtube-dl 的脚本,该脚本下载播放列表并将所有这些 flv 视频移动到特定目录中。

到目前为止,这是我的代码:

import shutil
import os
import sys
import subprocess
# Settings
root_folder = 'C:/Users/Robert/Videos/YouTube/Playlists/$s'

def download():
    files = open('Playlists.txt').readlines()

    for playlist in files:
        p = playlist.split(';')

    # Create the directory for the playlist if it does not exist yet
    if not os.path.exists (root_folder % p[0]):
        os.makedirs(root_folder % p[0])

    # Download every single video from the given playlist
    download_videos = subprocess.Popen([sys.executable, 'youtube-dl.py', ['-cit'], [p[1]]])        
    download_videos.wait()

    # Move the video into the playlist folder once it is downloaded
    shutil.move('*.flv', root_folder % p[0])


download()

我的 Playlists.txt 的结构如下所示:

Playlist name with spaces;http://www.youtube.com/playlist?list=PLBECF255AE8287C0F&feature=view_all

我遇到两个问题。首先,字符串格式不起作用。

我得到错误:

Playlist name with spaces
Traceback (most recent call last):
  File ".\downloader.py", line 27, in <module>
    download()
  File ".\downloader.py", line 16, in download
    if not os.path.exists (root_folder % p[0]):
TypeError: not all arguments converted during string formatting

任何人都可以解释我的原因吗?当我打印 p[0] 时,一切看起来都很好。

其次,我不知道如何设置正确的 shutil.move 命令以仅移动刚刚下载的 flv 视频。我该如何过滤?

谢谢!

4

2 回答 2

4

免责声明:我不在 Windows 上

要点是您应该os.path.join()用于连接路径。

但是这个字符串似乎有几个问题:

root_folder = 'C:/Users/Robert/Videos/YouTube/Playlists/$s'

我觉得:

  • 你需要使用双转义的反斜杠。
  • 你的意思是%s代替$s.
  • 无论如何都不需要%s, os.path.join()是加入路径的跨平台方式。
  • [可选]恕我直言反斜杠更具可读性。

所以我想说你需要将该行更改为:

root_folder = 'C:/Users/Robert/Videos/YouTube/Playlists'

或者

root_folder = 'C:\\Users\\Robert\\Videos\\YouTube\\Playlists'

或者

root_folder = r'C:\Users\Robert\Videos\YouTube\Playlists'

然后执行以下操作:

my_path = os.path.join(root_folder, p[0])
if not os.path.exists(my_path):
    # ...

注意:来自官方os.path.join()文档

请注意,在 Windows 上,由于每个驱动器都有一个当前目录,因此os.path.join("c:", "foo")表示相对于驱动器C:( c:foo) 上当前目录的路径,而不是c:\foo.

从有用的Spencer Rathbun示例来看,在 windows 上你应该得到:

>>> os.path.join('C', 'users')
'C\\users'
>>> os.path.join('C:','users')
'C:users'

这意味着您必须使用以下任一选项:

>>> os.path.join('C:/', 'users')
'C:\\users'
>>> os.path.join(r'C:\', 'users')
'C:\\users'
于 2012-03-15T10:08:33.543 回答
2

$ 符号不是字符串格式的有效字符,请改用 %:

root_folder = 'C:/Users/Robert/Videos/YouTube/Playlists/$s'
print root_folder % 'testfolder'

给我:'TypeError:字符串格式化期间并非所有参数都转换'

root_folder = 'C:/Users/Robert/Videos/YouTube/Playlists/%s'
print root_folder % 'testfolder'

给我:'C:/Users/Robert/Videos/YouTube/Playlists/testfolder'

于 2012-03-15T10:04:07.190 回答