2012-03-15 21 views
2

Pythonを学び理解するyoutube-dlに基づいてスクリプトを作成して、プレイリストをダウンロードして特定のディレクトリにあるすべてのflvビデオを移動します。Python - ディレクトリを作成して特定のファイルを移動する

これは、これまでの私のコードです:次のように

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]を印刷すると、すべてがうまく見えます。

第2に、正しいshutil.moveコマンドを設定して、ダウンロードしたばかりのflvビデオだけを移動する方法を知りません。それをどのようにフィルタリングできますか?

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

+0

あなたのコードがあなたのシステム上で正しくインデントされていれば幸いです。そうでなければ 'p = playlist.split( ';')'行はあなたが望むことをしません。 –

+0

もちろんです。私は上記のコードを編集しました。通知ありがとう! – orschiro

+0

質問を編集するだけで、より多くの情報や改善が得られます(改善のために、書式の改善、タイプの修正などが含まれます)。他の変更があれば質問が変わるので、あなたがすでに持っている答えは意味をなさないでしょう。あなたを最も助けてくれた答えを前の[編集]に戻してください。あなたの新しい問題を述べる新しい質問を開くことを歓迎します:) –

答えて

4

免責事項:私は窓にはない

主なポイントは、パスを結合するためにos.path.join()を使用することです。

しかし、この文字列での問題のカップルがあるように思われる:

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

私はと思う:

  • あなたは二重のエスケープbackslahsesを使用する必要があります。
  • $sの代わりに%sを意味しました。
  • とにかく%sの必要はありません。os.path.join()は、パスを結合するためのクロスプラットフォームの方法です。
  • [オプション] imho backsleshesが読みやすくなりました。

だから私はあなたにその行を変更する必要があることを言うだろう:

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() docから:あなたは

Note that on Windows, since there is a current directory for each drive, os.path.join("c:", "foo") represents a path relative to the current directory on drive C: (c:foo), not 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' 
+1

pythonはWindowsパスのスラッシュに問題はなく、OSベースのコマンド(例えばshutil.move)を使用すると自動的にそれらを変換します。 – aquavitae

+0

@aquavitae:知っておいて、私はそれについては分かりませんでした。それは他のものよりも使い道があるのか​​? –

+0

わかりません。私はフォワードスラッシュを使用して、Linuxとの互換性(できるだけドライブレターを考慮して)を保つ傾向があります。バックスラッシュを使用するときは、一般に生の文字列を使用してエスケープしません。 – aquavitae

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 /プレイリスト/テストフォルダ'

+1

どのように愚かです。私はそれが%記号の代わりに$であることを完全に見落としました... – orschiro

関連する問題