2017-08-05 14 views
0

私はムービーコレクションをリッピングするプログラムを持っていますが、私はそれをさらに自動化しようとしています。私の目的は、各フォルダーを検索し、 ".mkv"ファイルを探し、見つかった場合はルートフォルダーに移動し、元のフォルダーを削除することです。Pythonを使用してファイルを拡張子でルートフォルダに移動

私はこれをうまく使いこなしていますが、それは動作していますが、どのようにしてよりうまく書き込めるか不思議です。本質的にこの疑似コードを実行する方法はありますか?

loop each folder: 
    if folder has files: 
    if file extention is '.mkv': 
     move file to '/media/movies/' 

フォルダ構造は、ここで

C:/Users/Matthew/Desktop/New folder (2) 
    - Test Movie 
     ~ Test_Movie_t00.mkv 
    - Alpha Movie 
     ~ Alpha_Movie_t200.mkv 
    - Greatest Movie Ever 
     ~ Greatest_Movie_Ever_t100.mkv 
    ~ Good Format Movie.mkv 
    ~ Stackoverflow the Movie.mkv 

で働く私のコードです。

import os 
import re 

print("Running Cleaner\n") 
directory = 'C:/Users/Matthew/Desktop/New folder (2)' 
directorylength=len(directory)+1 
folders = [] 
movies = [] 
for root, dirs, files in os.walk(directory, topdown=False): 
    for name in dirs: 
     #print(os.path.join(root, name)[strlength:]) 
     folders.append(os.path.join(root, name)[directorylength:]) 
for folder in folders: 
    for file in os.listdir(directory + "/" + folder): 
     if file.endswith(".mkv"):  
      #print(os.path.join(folder, file)) 
      movies.append(os.path.join(folder, file)[len(folder)+1:]) 
for folder in folders: 
    for movie in movies: 
     if os.path.exists(directory + "/" + folder + "/" + movie): 
      file=folder + "/" + movie 
      print("Found: " + file) 
      newFile = re.sub('_t\d{2,}.mkv',".mkv",file) 
      newFile = re.sub('_',' ',newFile) 
      newFile = newFile[len(folder)+1:] 
      print("Renaming to: " + newFile) 
      os.rename(directory + "/" + file, directory + "/" + newFile) 
    print("Removing empty folder: " + folder) 
    os.rmdir(directory + "/" +folder) 
print("\nFinished Cleaning up!") 
+0

スローされます、あなたはグロブを使用してみましたか? – liorko

+1

https://codereview.stackexchange.comに追加すると、より良い提案を得るのに役立ちます –

答えて

0
  1. このことについての素晴らしい事は、将来的には複数の拡張子をサポートしている先のパスに

    mapping = {'mkv' : '/media/movies/', ... } 
    

    の拡張子のマッピングを保管してください。

  2. shutil.moveを使用しos.path.splitext

  3. に分割することにより、拡張をチェックし、あなたがディレクトリとして宛先を指定することができます。それは物事を単純化する

  4. if not os.listdirディレクトリが空であるかどうかを確認する。 (ディレクトリが空でない場合)それ以外の場合、エラーが


mapping = {'mkv' : '/media/movies/', ... } 
for root, dirs, files in os.walk(directory, topdown=False): 
    for file in files: 
     fullpath = os.path.join(root, file) 
     _, ext = os.path.splitext(fullpath) 
     if ext in mapping: 
      shutil.move(fullpath, mapping[ext]) 

    for dir in dirs: 
     fullpath = os.path.join(root, dir) 
     if not os.listdir(fullpath): 
      os.rmdir(fullpath) 
関連する問題