2016-02-29 1 views
0

J'essaie de corriger un script qui va parcourir un répertoire donné et renommer, déplacer et supprimer le répertoire d'origine. Chaque répertoire contient un fichier *.mp4 et un sous-dossier contenant les fichiers *.jpg. Je rencontre des difficultés pour supprimer le répertoire d'origine lorsque j'ai fini de renommer et de déplacer les fichiers. Ce qui est à ce jour:Renommage, déplacement et suppression du répertoire d'origine

import datetime, os, re, shutil, logging, smtplib 

logging.basicConfig(level = logging.INFO, format = ' %(asctime)s - %(levelname)s - %(message)s') 
#logging.disable(logging.info) 

path = '\\\\RT-N66U\\sda2\\Documents' 
desired_text1 = re.compile(r'^\d{3}_[a-zA-Z]+\d{3}.jpg') 
desired_text2 = re.compile(r'^\d{3}_[a-zA-Z]+_\d{3}.jpg') 
renamed_files = '' 

for folderName, subfolders, filenames in os.walk(path): 
    if folderName.startswith(path + '\\GEO-'): 
      logging.info('The current folder is ' + folderName) 

      for subfolder in subfolders: 
        if subfolder.startswith('Pics'): 
          pic_folder = subfolder 

      for filename in filenames:       
        if filename.endswith('.mp4'): 
          changed_date = datetime.datetime.strptime(filename[3:17], '%b %d, %Y').strftime('%y.%m.%d') # Changes the name of the date to the desired format 
          year = datetime.datetime.strptime(filename[3:17], '%b %d, %Y').strftime('%Y') 
          name = filename[20:-25] 
          name = name.lower() 
          modified_name = '.'.join(re.findall('\S+', name)) 
          final_name = 'geo.' + changed_date + '.' + modified_name 

        if not os.path.exists('\\\\RT-N66U\\sda2\\Me\\GEO\\%s\\%s\\%s' % (year, changed_date[3:5], final_name)):    
          os.makedirs('\\\\RT-N66U\\sda2\\Me\\GEO\\%s\\%s\\%s' % (year, changed_date[3:5], final_name)) 

        if not os.path.exists('\\\\RT-N66U\\sda2\\Me\\GEO\\%s\\%s\\%s\\%s' % (year, changed_date[3:5], final_name, pic_folder)): 
          os.makedirs('\\\\RT-N66U\\sda2\\Me\\GEO\\%s\\%s\\%s\\%s' % (year, changed_date[3:5], final_name, pic_folder))   

        if filename.endswith('.mp4'): 
          logging.info(filename) 
          os.rename(folderName + '\\' + filename, '\\\\RT-N66U\\sda2\\Me\\GEO\\%s\\%s\\%s\\%s.mp4' % (year, changed_date[3:5], final_name, final_name)) 

        # This part will logg and rename the files by adding a '_' 
        mo1 = desired_text1.search(filename) 
        mo2 = desired_text2.search(filename) 

        if mo1: 
          logging.info(folderName + '\\' + filename) 
          os.rename(folderName + '\\' + filename, '\\\\RT-N66U\\sda2\\Me\\GEO\\%s\\%s\\%s\\%s\\%s_%s' % (year, changed_date[3:5], final_name, pic_folder, filename[:-7], filename[-7:])) 
          renamed_files += filename + ' -> ' + filename[:-7] + '_' + filename[-7:] + '\n' 

        elif mo2: 
          logging.info(folderName + '\\' + filename) 
          os.rename(folderName + '\\' + filename, '\\\\RT-N66U\\sda2\\Me\\GEO\\%s\\%s\\%s\\%s\\%s' % (year, changed_date[3:5], final_name, pic_folder, filename)) 
          renamed_files += filename + '\n' 

    # This part will check if the directory is empty and delete it if so 
    if os.listdir(folderName) == []: 
      logging.info(folderName) 
      shutil.rmtree(folderName) 

Ce qui finit par se produire est que tous les sous-répertoires seront supprimés si elles sont vides et en laissant le répertoire vide primaire. Je voudrais également supprimer le répertoire principal, puisque tous les fichiers ont été déplacés. Existe-t-il un moyen d'accomplir ceci dans l'instruction for?

Répondre

0

Si vous voulez supprimer le répertoire appelé folderName dans votre boucle principale for, je pense que ce n'est pas vraiment possible puisque vous itérez sur un objet qui le contient. Comme si dans un for i in this_list: vous souhaitez supprimer un objet de cette liste. Ce n'est pas possible avant que vous soyez hors de la boucle. Pour obtenir ce que vous voulez, j'écrirais une fonction pour recurse dans l'arborescence de dossiers. L'idée serait quelque chose comme:

def process_folder(folder_name): 
    do some stuff on files 
    get the subfolders of folder_name 
    for f in subfolders: 
     process_folder(subfolder_name) 
     if subfolder_name is empty, delete it 
    maybe do some other stuff on files 

et dans le script principal, appelez process_folder(path). (Cela ne laisserait que le dossier supérieur, même s'il est vide, alors assurez-vous de ne pas le supprimer, ou d'appeler process_folder à un niveau supérieur, ou d'ajouter une instruction pour le supprimer s'il est vide).