Python - Создание каталога и перемещение определенного файла
-
16-12-2019 - |
Вопрос
Изучая и лучше понимая 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()
Структура my 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-видео.Как я могу это отфильтровать?
Спасибо!
Решение
Отказ от ответственности:Я не пользуюсь 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
.
Судя по полезным Спенсер Ратбан например, в 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'
Другие советы
$ Знак не является действительным символом для форматирования строки, используйте% вместо этого:
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 / Video / YouTube / Playlists / Testfolder»