3

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

私は2つの問題に遭遇します。まず、文字列の書式設定が機能しません。

エラーが発生します:

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] を印刷すると、すべて問題なく表示されます。

次に、ダウンロードしたばかりの flv ビデオのみを移動するように、適切な shutil.move コマンドを設定する方法がわかりません。どうすればそれをフィルタリングできますか?

ありがとうございました!

4

2 に答える 2

4

免責事項:私は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:fooc:\foo

便利なSpencer Rathbunの例から判断すると、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'
于 2012-03-15T10:08:33.543 に答える
2

$ 記号は、文字列の書式設定に有効な文字ではありません。代わりに % を使用してください。

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/Playlists/testfolder」

于 2012-03-15T10:04:07.190 に答える