Zrobiłem skrypt do organizowania torrentów. Pobieram programy telewizyjne, a następnie przenoszę pliki na inny dysk do folderu takiego jak / nazwa serii / sezon xx /. Działało z niektórymi problemami, dopóki nie dodałem kilku „if”. Widziałem problem z rozróżnianiem wielkości liter. Na przykład, jeśli pobiorę plik mr robot.mkv i folder Mr Robot już istniał, utworzy się inny folder jako mr robot. Zrobiłem to samo z sezonem, aby nie podwoić sezonu, jeśli sezon już istnieje. Najwyraźniej mój skrypt nieustannie próbuje utworzyć folder i nie rozumiem dlaczego.

#!/usr/bin/env python3
import sys, glob, re, os, shutil
from termcolor import colored
#enconding: utf-8

dir_series = "/home/user/series/series/"

buscar = "*[sS][0-9][0-9]*"

series = [s for s in glob.glob(buscar) if s.endswith(('.mp4', '.srt', '.avi', '.mkv'))]
if series:
    arch_encontrados = len(series)
    print(colored("\nArchivos encontrados:",'red', attrs=['bold'] ), colored(arch_encontrados, 'red', attrs=['bold'] ),'\n')
    print(*series, sep = "\n")

    for serie in series:

        #Extraer el nombre de la serie
        nombre = re.findall(r'.*[\. ][sS]\d', serie)[0]
        nombre_final = re.sub(r'[\. ][sS]\d','',nombre).replace('.',' ')
        #Extraer el número de la temporada
        season = re.findall(r'[\. ][sS]\d\d', serie)[0]
        season_final_numero = re.sub(r'[\. ][sS]','',season)
        season_final = ('Season ' + season_final_numero)
        #Armar el directorio final
        for series_path in os.listdir(dir_series): #lista el contenido de /home/user/series/series/
          if nombre_final.lower() == series_path.lower(): #compara el listado con la salida del nombre de la serie sin importar mayúsculas y minúsculas
              for season_path in os.listdir(dir_series + series_path):
               if season_final == season_path: #compara el listado de seasons contra season_final que tiene mayuscula
                path = os.path.join(dir_series, series_path, season_final)
                print(path)
               else:
                path = os.path.join(dir_series, series_path, 'season ', season_final_numero)
          else:
           print(colored("\n\n*****************************************",'cyan', attrs=['bold']))  
           print(colored("** Directorio no encontrado, creándolo **",'cyan', attrs=['bold']))  
           print(colored("*****************************************\n",'cyan', attrs=['bold']))  
           path = os.path.join(dir_series, nombre_final, season_final)
           print(path)
           os.makedirs(path) 

        #Mover el archivo
        print(colored('\nCopiando','green'), serie, colored('a', 'green'), path + '/' + serie)
        shutil.move(serie,path)



else:
    print(colored('\nNo hay archivos para organizar.','green', attrs=['bold']))

input(colored("\n\nPresione Enter para continuar ...", attrs=['blink', 'bold']))
0
elRestaurador 20 listopad 2019, 21:07
1
Myślę, że pomogłoby innym rozwiązać problem, gdybyś mógł uprościć swój kod, aby był minimalnym powtarzalnym przykładem. W obecnej sytuacji jest tu zbyt dużo kodu, aby ktoś mógł go łatwo przejrzeć.
 – 
Enthus3d
20 listopad 2019, 21:18

1 odpowiedź

Nie widzę nieskończonej pętli, ale myślę, że widzę błąd, który powoduje, że ten sam katalog jest tworzony wiele razy.

Wołasz os.makedirs w innym miejscu swojej wewnętrznej pętli for, co oznacza, że utworzysz ten sam katalog raz dla każdego pliku w os.listdir(dir_series), który NIE pasuje do nombre_final.lower().

Myślę, że problem może po prostu polegać na tym, że Ty (lub Twoje IDE) przypadkowo wciąłeś wywołanie os.makedirs(path) o dwa poziomy zbyt głęboko, kiedy dodałeś if / else. Myślę, że musi całkowicie znajdować się poza wewnętrzną pętlą.

Prawdopodobnie musisz również dodać break w przypadku, gdy pasuje, a może także strażnik, aby uniemożliwić mu tworzenie nowego katalogu w przypadku znalezienia dopasowania?

1
Personman 20 listopad 2019, 21:17