Question

L'apprentissage et la compréhension Python mieux ce que je veux écrire un script basé sur youtube-dl qui télécharge une liste de lecture et se déplace toutes ces vidéos flv dans un répertoire spécifique.

C'est mon code pour l'instant:

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()

La structure de mon Playlists.txt se présente comme suit:

Playlist name with spaces;http://www.youtube.com/playlist?list=PLBECF255AE8287C0F&feature=view_all

Je rencontre deux problèmes.Tout d'abord, la mise en forme de chaîne ne fonctionne pas.

J'obtiens l'erreur:

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

Quelqu'un peut-il m'expliquer la raison?Lorsque j'imprime p[0] tout semble parfait.

Deuxièmement, je n'ai aucune idée de comment régler correctement la shutil.la commande de déplacement pour déplacer uniquement la vidéo flv qui vient d'être téléchargé.Comment puis-je filtre?

Merci!!!!

Était-ce utile?

La solution

Avertissement:Je ne suis pas sur windows

Le point principal est que vous devez utiliser os.path.join() pour rejoindre les chemins d'accès.

Mais il semble y avoir quelques problèmes avec cette chaîne:

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

Je pense que:

  • vous devez utiliser la double échappé backslahses.
  • Que vous vouliez dire %s au lieu de $s.
  • Il n'y a pas besoin de toute façon pour %s, os.path.join() est la croix-plate-forme de chemin pour rejoindre les chemins d'accès.
  • [facultatif] à mon humble avis backsleshes sont plus lisibles.

Donc, je dirais que vous avez besoin de changer cette ligne:

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

ou

root_folder = 'C:\\Users\\Robert\\Videos\\YouTube\\Playlists'

ou

root_folder = r'C:\Users\Robert\Videos\YouTube\Playlists'

Et puis faire quelque chose comme:

my_path = os.path.join(root_folder, p[0])
if not os.path.exists(my_path):
    # ...

Note: De l'officiel os.path.join() doc:

Notez que sous Windows, car il y a un répertoire pour chaque lecteur, os.path.join("c:", "foo") représente un chemin relatif au répertoire courant sur le lecteur C: (c:foo), pas c:\foo.

À en juger par le utile Spencer Rathbun exemple, sur windows, vous devriez obtenir:

>>> os.path.join('C', 'users')
'C\\users'
>>> os.path.join('C:','users')
'C:users'

Ce qui signifie que vous devez utiliser une des méthodes suivantes:

>>> os.path.join('C:/', 'users')
'C:\\users'
>>> os.path.join(r'C:\', 'users')
'C:\\users'

Autres conseils

Le signe $ n'est pas un caractère valide pour la mise en forme de chaîne, utilisez%% à la place:

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

me donne: 'TypeError: pas tous les arguments convertis lors de la mise en forme de chaîne'

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

me donne: 'C: / Utilisateurs / Robert / Vidéos / YouTube / Playlists / TestFolder'

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top