es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar archivos mp3 más pequeños con nombres similares en Python.

He estado enfrentando el siguiente problema:
– Hay un directorio donde la estación de radio en línea está descargando y almacenando archivos mp3.
– Algunos de ellos se reproducen y almacenan varias veces, la diferencia está en el nombre:
– El primer archivo hasta el punto tiene un nombre único: something.mp3
– El segundo archivo antes del punto tiene paréntesis: something(1).mp3
– El tercer archivo antes del punto tiene paréntesis: something(2).mp3 y así sucesivamente…
Me gustaría eliminar los archivos más pequeños y dejar solo uno de ellos.
Por lo tanto, he iniciado el siguiente script:

#!/usr/bin/python3

import os
import datetime
import sys
import glob
from collections import Counter

path = "/ruta_de_los_archivos_mp3/"

dirs = os.listdir(path)
list_of_files = []
mp3files = []
mp3_with_bracket = []
mp3_without_bracket = []
pending_files = []

for file in dirs:
    if ")" not in file:
        mp3_without_bracket.append(file)
    else:
        mp3_with_bracket.append(file)
print(mp3_with_bracket)
print("-------------------------------------------------------------------------------------------------------------")
print(mp3_without_bracket)
mp3_without_bracket.sort()
mp3_with_bracket.sort()

La lógica detrás es crear 2 listas, una con paréntesis y otra sin paréntesis.
¿Pero qué sigue ahora?
¿Podrías darme algún consejo sobre cómo terminarlo? ¿De todas formas, la lógica es lo suficientemente buena?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La lógica detrás de separar los archivos mp3 con y sin corchetes es un buen comienzo. Un enfoque para eliminar los archivos más pequeños y solo dejar uno de ellos puede ser el siguiente:

    1. Para los archivos mp3 con corchetes, extrae el nombre del archivo original (sin corchetes ni número) y guárdalos en una lista.
    2. Utiliza Counter de collections para contar la aparición de cada nombre de archivo original en la lista.
    3. Para cada nombre de archivo original con múltiples apariciones, encuentra los archivos correspondientes con corchetes y elimina todos excepto el que tenga el número más alto.
    4. Para los archivos mp3 sin corchetes, de manera similar, extrae el nombre del archivo original y cuenta su aparición.
    5. Para cada nombre de archivo original con múltiples apariciones, compara los tamaños de archivo y elimina los archivos más pequeños.

    Aquí tienes una posible implementación del enfoque anterior:

    import os
    import glob
    from collections import Counter
    
    path = "/ruta_de_los_archivos_mp3/"
    os.chdir(path)
    
    # separar los archivos mp3 con y sin corchetes
    mp3_con_corchetes = []
    mp3_sin_corchetes = []
    for archivo in glob.glob("*.mp3"):
        if ")" in archivo:
            mp3_con_corchetes.append(archivo)
        else:
            mp3_sin_corchetes.append(archivo)
    
    # procesar los archivos mp3 con corchetes
    nombres_archivo_originales = [nombre.split("(")[0] for nombre in mp3_con_corchetes]
    conteo = Counter(nombres_archivo_originales)
    for nombre, cantidad in conteo.items():
        if cantidad > 1:
            archivos_a_eliminar = [archivo for archivo in mp3_con_corchetes if nombre in archivo]
            archivos_a_eliminar.sort(key=lambda x: int(x.split("(")[1].split(")")[0]))
            for archivo in archivos_a_eliminar[:-1]:
                os.remove(archivo)
    
    # procesar los archivos mp3 sin corchetes
    nombres_archivo_originales = [nombre.split(".mp3")[0] for nombre in mp3_sin_corchetes]
    conteo = Counter(nombres_archivo_originales)
    for nombre, cantidad in conteo.items():
        if cantidad > 1:
            archivos_a_eliminar = [archivo for archivo in mp3_sin_corchetes if nombre in archivo]
            archivos_a_eliminar.sort(key=lambda x: os.path.getsize(x))
            for archivo in archivos_a_eliminar[:-1]:
                os.remove(archivo)
    

    Ten en cuenta que esta implementación asume que los nombres de archivo están formateados de manera consistente como se describe en la instrucción. Es buena práctica probarlo en un pequeño subconjunto de archivos o hacer copias de seguridad antes de ejecutarlo en el conjunto completo de archivos.

Comments are closed.