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.

Escribir una función para mover dos archivos con el mismo nombre (pero con diferentes extensiones de archivo) a una carpeta con el mismo nombre en Python.

Tengo las carpetas organizadas en el siguiente formato:

AAPL176546 (subcarpeta vacía)
AAPL
2000 (subcarpeta vacía)
AAPL30234 (subcarpeta vacía)
AAPL
176546.mp3
AAPL176546.txt
AAPL
2000.mp3
AAAPL2000.txt
AAPL
30234.mp3
AAPL_30234.txt

Estoy buscando iterar a través de la carpeta y mover tanto los archivos .txt como los .mp3 correspondientes a las subcarpetas (por ejemplo, mover AAPL176546.mp3 y AAPL176546.txt a AAPL_176546).

He intentado:

import os
import shutil

srcpath = “C:/Users/xeb15154/OneDrive – University of Strathclyde/Audio Files (5,506)/AAPL/”
destpath = “C:/Users/xeb15154/OneDrive – University of Strathclyde/Audio Files (5,506)/AAPL/”

for root, subFolders, files in os.walk(srcpath):
for file in files:
subFolder = os.path.join(destpath, file)
if not os.path.isdir(subFolder):
os.makedirs(subFolder)
shutil.move(os.path.join(root, file), subFolder)

pero esto crea carpetas para cada archivo, es decir, subcarpetas llamadas AAPL176546.mp3 y AAPL176546.txt con los archivos correspondientes almacenados dentro. Además, cuando uso el código anterior con directorios que tienen archivos con diferentes longitudes de nombre de archivo, nuevamente falla.

¡Cualquier ayuda en el asunto sería muy apreciada!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mover tanto los archivos .txt como los archivos .mp3 correspondientes a sus subcarpetas respectivas según el nombre de la carpeta principal, puedes modificar la variable subFolder para que solo incluya el nombre de la carpeta principal y luego verificar si el nombre del archivo contiene este nombre de carpeta principal antes de moverlo a la subcarpeta. Aquí tienes una versión modificada de tu código que debería lograr esto:

    import os
    import shutil
    
    srcpath = "C:/Users/xeb15154/OneDrive - University of Strathclyde/Audio Files (5,506)/AAPL/"
    destpath = "C:/Users/xeb15154/OneDrive - University of Strathclyde/Audio Files (5,506)/AAPL/"
    
    for root, subFolders, files in os.walk(srcpath):
        for file in files:
            parentFolder = os.path.basename(root)
            if file.startswith(parentFolder):
                subFolder = os.path.join(destpath, parentFolder)
                if not os.path.isdir(subFolder):
                    os.makedirs(subFolder)
                shutil.move(os.path.join(root, file), subFolder)
    

    Este código primero obtiene el nombre de la carpeta principal del directorio raíz actual utilizando os.path.basename. Luego, verifica si el nombre del archivo actual comienza con este nombre de carpeta principal utilizando str.startswith. Si es así, el código crea la subcarpeta basada en el nombre de la carpeta principal y mueve el archivo a ella.

    Esto debería funcionar independientemente de la longitud de los diferentes nombres de archivo en tus directorios.

Comments are closed.