Python - Создание каталога и перемещение определенного файла

StackOverflow https://stackoverflow.com//questions/9717411

  •  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»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top