Python - 创建目录并移动特定文件

时间:2012-03-15 09:56:52

标签: python subprocess shutil

更好地学习和理解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视频。我该如何过滤?

谢谢!

2 个答案:

答案 0 :(得分:4)

免责声明:我不在Windows上

重点是你应该使用os.path.join()加入路径。

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

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

我认为:

  • 你需要使用双重逃脱的反击。
  • 您的意思是%s而不是$s
  • 无论如何%s都没有必要,os.path.join()是加入路径的跨平台方式。
  • [可选] imho backsleshes更具可读性。

所以我要说你需要改变这一行:

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'