Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: SlayerBur en 29 Mayo 2021, 00:33 am



Título: Mueve unicamente archivos de mi carpeta a otra Python
Publicado por: SlayerBur en 29 Mayo 2021, 00:33 am
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:


Código:
ruta = os.getcwd()

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


Código:
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)

Código:
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




Título: Re: Mueve unicamente archivos de mi carpeta a otra Python
Publicado por: 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
  1. #!/usr/local/bin/python3.7
  2.  
  3. import os
  4. import shutil
  5. import pathlib
  6.  
  7. RECURSIVE: bool = False
  8.  
  9. def mglob(extension: str, input_dir: str, target_dir: str, recursive: bool = False):
  10.    """
  11.    Mueve todos los archivos con la extensión `extension` en
  12.    `input_dir` a `target_dir`. Si `recursive` es *True* se
  13.    tratará de bajar a los demás subniveles de directorios.
  14.    """
  15.  
  16.    if (recursive):
  17.        path_obj = pathlib.Path(input_dir).rglob("*.%s" % extension)
  18.    else:
  19.        path_obj = pathlib.Path(input_dir).glob("*.%s" % extension)
  20.  
  21.    for f in path_obj:
  22.        print(f"Moviendo {input_dir}/{f} a {target_dir}/")
  23.        shutil.move(str(f), target_dir)
  24.  
  25. def main():
  26.    try:
  27.        extension = input("Extensión de los archivos objetivo: ")
  28.    except (KeyboardInterrupt, EOFError):
  29.        return
  30.  
  31.    if not (extension):
  32.        print("¡Es necesario introducir la extensión!")
  33.        return
  34.  
  35.    try:
  36.        input_dir = input("Directorio de entrada: ")
  37.    except (KeyboardInterrupt, EOFError):
  38.        return
  39.  
  40.    if not (os.path.isdir(input_dir)):
  41.        print("%s no existe o no es un directorio válido" % input_dir)
  42.        return
  43.  
  44.    if not (input_dir):
  45.        print("¡Es necesario introducir el directorio de entrada!")
  46.        return
  47.  
  48.    try:
  49.        target_dir = input("Directorio de salida: ")
  50.    except (KeyboardInterrupt, EOFError):
  51.        return
  52.  
  53.    if not (target_dir):
  54.        print("¡Es necesario introducir el directorio de salida!")
  55.        return
  56.  
  57.    if not (os.path.exists(target_dir)):
  58.        os.makedirs(target_dir, exist_ok=True)
  59.    elif not (os.path.isdir(target_dir)):
  60.        print("%s existe pero no es un directorio válido." % target_dir)
  61.        return
  62.  
  63.    mglob(extension, input_dir, target_dir, RECURSIVE)
  64.  
  65. if (__name__ == "__main__"):
  66.    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


Título: Re: Mueve unicamente archivos de mi carpeta a otra Python
Publicado por: SlayerBur en 29 Mayo 2021, 23:09 pm
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
  1. #!/usr/local/bin/python3.7
  2.  
  3. import os
  4. import shutil
  5. import pathlib
  6.  
  7. RECURSIVE: bool = False
  8.  
  9. def mglob(extension: str, input_dir: str, target_dir: str, recursive: bool = False):
  10.    """
  11.    Mueve todos los archivos con la extensión `extension` en
  12.    `input_dir` a `target_dir`. Si `recursive` es *True* se
  13.    tratará de bajar a los demás subniveles de directorios.
  14.    """
  15.  
  16.    if (recursive):
  17.        path_obj = pathlib.Path(input_dir).rglob("*.%s" % extension)
  18.    else:
  19.        path_obj = pathlib.Path(input_dir).glob("*.%s" % extension)
  20.  
  21.    for f in path_obj:
  22.        print(f"Moviendo {input_dir}/{f} a {target_dir}/")
  23.        shutil.move(str(f), target_dir)
  24.  
  25. def main():
  26.    try:
  27.        extension = input("Extensión de los archivos objetivo: ")
  28.    except (KeyboardInterrupt, EOFError):
  29.        return
  30.  
  31.    if not (extension):
  32.        print("¡Es necesario introducir la extensión!")
  33.        return
  34.  
  35.    try:
  36.        input_dir = input("Directorio de entrada: ")
  37.    except (KeyboardInterrupt, EOFError):
  38.        return
  39.  
  40.    if not (os.path.isdir(input_dir)):
  41.        print("%s no existe o no es un directorio válido" % input_dir)
  42.        return
  43.  
  44.    if not (input_dir):
  45.        print("¡Es necesario introducir el directorio de entrada!")
  46.        return
  47.  
  48.    try:
  49.        target_dir = input("Directorio de salida: ")
  50.    except (KeyboardInterrupt, EOFError):
  51.        return
  52.  
  53.    if not (target_dir):
  54.        print("¡Es necesario introducir el directorio de salida!")
  55.        return
  56.  
  57.    if not (os.path.exists(target_dir)):
  58.        os.makedirs(target_dir, exist_ok=True)
  59.    elif not (os.path.isdir(target_dir)):
  60.        print("%s existe pero no es un directorio válido." % target_dir)
  61.        return
  62.  
  63.    mglob(extension, input_dir, target_dir, RECURSIVE)
  64.  
  65. if (__name__ == "__main__"):
  66.    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 :)