Python - создать каталог и переместить определенный файл - PullRequest
2 голосов
/ 15 марта 2012

Изучение и понимание 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 ]

4 голосов
/ 15 марта 2012

Отказ от ответственности: я не на 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 пример, на окнах вы должны получить:

>>> 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'
2 голосов
/ 15 марта 2012

Знак $ не является допустимым символом для форматирования строки, вместо этого используйте%:

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

Дает мне: 'Ошибка типа: не все аргументы, преобразованные во время форматирования строки'

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

Дает мне: 'C: / Users / Robert / Videos / YouTube / Playlists / testfolder'

...