Mueve unicamente archivos de mi carpeta a otra Python

Iniciado por SlayerBur, 29 Mayo 2021, 00:33 AM

0 Miembros y 1 Visitante están viendo este tema.

SlayerBur

Buen día.

Sucede que tengo un "problema" con un pequeño organizador que intento crear (quiero mediante una interface crear carpetas, seleccionar las extensiones y que luego organice las carpetas le programa), tengo practicamente todo ya.
Përo el problema sucede ahora, que estoy intentando poder hacer dicho trabajo desde otras carpetas (No desde donde tengo el .py).

Codigo:


ruta = os.getcwd()

def obtenerUbicacion():
   global ruta
   ruta = filedialog.askdirectory(parent=root, initialdir=os.getcwd(), title="Selecciones una carpeta:")



def moverarchivos():
   global ruta
   for archivo in testruta():
       nombre, extensión = os.path.splitext(archivo)
       for llave, dato in datos.items():
           ubicacion = ruta + "/" + llave
           for i in dato:
               if (extensión == ".py"):
                   pass
               elif (i == extensión):
                   shutil.move(archivo, ubicacion)
                   print(ubicacion)


def testruta():
   global ruta

   Archivos = os.listdir(ruta) #Obtengo los archivos existentes
   
   archivosExistentes = []
   for archivo in Archivos:
       archivosExistentes.append(archivo)
   print(ruta)
   print(archivosExistentes)
   return archivosExistentes


Eso es absolutamente todo lo que tengo sobre mover el archivo.
esta en el mismo orden que lo tengo en el programa (solo que a diferentes alturas, no todo exactamente uno debajo de otro).

Sucede que unicamente me copia los archivos de la carpeta raiz (donde tengo el .py), a la carpeta que selecciono.
Y lo que quiero, es que busque los archivos dentro de la carpeta misma donde esta la ruta, no se si me explico...

Pd: el testruta lo puse para intentar separar el codigo, y ir haciendo pruebas de donde estaba el programa en cada momento, y de donde buscaba archivos),

Todos los print que tengo, todos siempre me dan la ubicacion, y los archivos correctos de donde selecciono la carpeta (Intente en muchas carpetas y todo correcto)., pero al utilizar la funcion de moverarchivos desde el boton, quita el contenido de carpeta raiz, y se lo lleva a la carpeta nueva

Espero que se haya entendido y gracias de antemano



DtxdF

#1
Hola @SlayerBur

Creo comprender lo que deseas. Lo que quieres es crear una carpeta con un nombre específico y que allí contenga archivos con extensiones específicas. Por lo que veo quieres mover esos archivos, no copiarlos, así que usa archivos de pruebas por si acaso.

Código (python) [Seleccionar]
#!/usr/local/bin/python3.7

import os
import shutil
import pathlib

RECURSIVE: bool = False

def mglob(extension: str, input_dir: str, target_dir: str, recursive: bool = False):
    """
    Mueve todos los archivos con la extensión `extension` en
    `input_dir` a `target_dir`. Si `recursive` es *True* se
    tratará de bajar a los demás subniveles de directorios.
    """

    if (recursive):
        path_obj = pathlib.Path(input_dir).rglob("*.%s" % extension)
    else:
        path_obj = pathlib.Path(input_dir).glob("*.%s" % extension)

    for f in path_obj:
        print(f"Moviendo {input_dir}/{f} a {target_dir}/")
        shutil.move(str(f), target_dir)

def main():
    try:
        extension = input("Extensión de los archivos objetivo: ")
    except (KeyboardInterrupt, EOFError):
        return

    if not (extension):
        print("¡Es necesario introducir la extensión!")
        return

    try:
        input_dir = input("Directorio de entrada: ")
    except (KeyboardInterrupt, EOFError):
        return

    if not (os.path.isdir(input_dir)):
        print("%s no existe o no es un directorio válido" % input_dir)
        return

    if not (input_dir):
        print("¡Es necesario introducir el directorio de entrada!")
        return

    try:
        target_dir = input("Directorio de salida: ")
    except (KeyboardInterrupt, EOFError):
        return

    if not (target_dir):
        print("¡Es necesario introducir el directorio de salida!")
        return

    if not (os.path.exists(target_dir)):
        os.makedirs(target_dir, exist_ok=True)
    elif not (os.path.isdir(target_dir)):
        print("%s existe pero no es un directorio válido." % target_dir)
        return

    mglob(extension, input_dir, target_dir, RECURSIVE)

if (__name__ == "__main__"):
    main()


Realmente lo único importante en el código son las librerías y la función mglob(...). Espero te sirva o por lo menos te dé una idea.

~ DtxdF

SlayerBur

Cita de: DtxdF en 29 Mayo 2021, 01:09 AM
Hola @SlayerBur

Creo comprender lo que deseas. Lo que quieres es crear una carpeta con un nombre específico y que allí contenga archivos con extensiones específicas. Por lo que veo quieres mover esos archivos, no copiarlos, así que usa archivos de pruebas por si acaso.

Código (python) [Seleccionar]
#!/usr/local/bin/python3.7

import os
import shutil
import pathlib

RECURSIVE: bool = False

def mglob(extension: str, input_dir: str, target_dir: str, recursive: bool = False):
    """
    Mueve todos los archivos con la extensión `extension` en
    `input_dir` a `target_dir`. Si `recursive` es *True* se
    tratará de bajar a los demás subniveles de directorios.
    """

    if (recursive):
        path_obj = pathlib.Path(input_dir).rglob("*.%s" % extension)
    else:
        path_obj = pathlib.Path(input_dir).glob("*.%s" % extension)

    for f in path_obj:
        print(f"Moviendo {input_dir}/{f} a {target_dir}/")
        shutil.move(str(f), target_dir)

def main():
    try:
        extension = input("Extensión de los archivos objetivo: ")
    except (KeyboardInterrupt, EOFError):
        return

    if not (extension):
        print("¡Es necesario introducir la extensión!")
        return

    try:
        input_dir = input("Directorio de entrada: ")
    except (KeyboardInterrupt, EOFError):
        return

    if not (os.path.isdir(input_dir)):
        print("%s no existe o no es un directorio válido" % input_dir)
        return

    if not (input_dir):
        print("¡Es necesario introducir el directorio de entrada!")
        return

    try:
        target_dir = input("Directorio de salida: ")
    except (KeyboardInterrupt, EOFError):
        return

    if not (target_dir):
        print("¡Es necesario introducir el directorio de salida!")
        return

    if not (os.path.exists(target_dir)):
        os.makedirs(target_dir, exist_ok=True)
    elif not (os.path.isdir(target_dir)):
        print("%s existe pero no es un directorio válido." % target_dir)
        return

    mglob(extension, input_dir, target_dir, RECURSIVE)

if (__name__ == "__main__"):
    main()


Realmente lo único importante en el código son las librerías y la función mglob(...). Espero te sirva o por lo menos te dé una idea.

~ DtxdF

En si lo que queria es ver el error del codigo mio.
Que logre solucionar, era agregar la linea:

archivo = ruta + "/" +archivo
en el for de archivoExistente

Gracias :)