更好地学习和理解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视频。我该如何过滤?
谢谢!
答案 0 :(得分: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()
doc:
请注意,在Windows上,由于每个驱动器都有一个当前目录,
os.path.join("c:", "foo")
表示相对于驱动器C:
(c:foo
)上当前目录的路径,而不是{{1 }}
根据有用的Spencer Rathbun示例判断,在Windows上你应该得到:
c:\foo
这意味着您必须使用以下任一项:
>>> os.path.join('C', 'users')
'C\\users'
>>> os.path.join('C:','users')
'C:users'
答案 1 :(得分:2)
$ sign不是字符串格式的有效字符,请改用%:
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 /播放列表/ testfolder'