2017-08-05 4 views
0

J'ai donc un programme qui déchire ma collection de films mais j'essaie de l'automatiser davantage. Mon but est de rechercher dans chaque dossier et de rechercher un fichier ".mkv" et s'il est trouvé, déplacez-le dans le dossier racine puis supprimez le dossier d'origine.Déplacez les fichiers par extension vers le dossier racine en utilisant Python

Je me suis mis au travail et c'est opérationnel mais je suis curieux de savoir comment il pourrait être mieux écrit. Y a-t-il un moyen de faire essentiellement ce pseudo code?

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

La structure du dossier est

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 

Voici mon code qui fonctionne.

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

Avez-vous essayé d'utiliser glob? – liorko

+1

Ajouter à https://codereview.stackexchange.com cela vous aider à obtenir une meilleure suggestion –

Répondre

0
  1. Gardez une cartographie des extensions de chemins de destination

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

    La bonne chose à ce sujet est le support de plusieurs extensions à l'avenir.

  2. Vérifiez l'extension par le fractionnement avec os.path.splitext

  3. En utilisant shutil.move, vous pouvez spécifier la destination en tant que répertoire. Cela simplifie les choses

  4. if not os.listdir pour vérifier si un répertoire est vide. Dans le cas contraire, les erreurs seront jetés (si le répertoire est pas vide)


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)