clsFTP.interactivo() navegar por un ftp y descargar archivo o directorio

Iniciado por darkucla, Enero 10, 2020, 03:20:28 PM

Tema anterior - Siguiente tema

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

Hola, soy Elfo!

Ahora les comparto este código el cuál utilizo para descargar archivos o directorios completos por ftp..
En la página para principiantes de facebook he estado compartiendo  este y otros códigos
Le faltan detalles.. espero alguien aquí le pueda servir y/o pueda ayudarme a mejorarlo

En la función interactivo() acepta comandos como
dir --> muestra listado directorio local actual
cd --> cambia directorio local
..  --> regresa al directorio padre remoto
<numero>   --> en el listado remoto slecciona el numero para acceder al directorio
d <numero> --> descarga el archivo o directorio enumerado al directorio local actual
q   --> termina interactivo

Código: python

import os  # clsFTP, copia(), clsUAC
# import sys  # clsUAC
# import ctypes   # clsUAC

# import shutil      # copia()
# from distutils.dir_util import copy_tree   # copia()

from ftplib import FTP   # clsFTP

class clsFTP():
    def __init__(self):
        self.DirLocal = os.getcwd()
        self.Servidor = ""
        self.Usuario = ""
        self.Password = ""
        self.DirRemoto = ""
        self.bolConectado = False
   
    def conecta(self, strServidor, strUsuario, strPassword):
        try:
            self.Servidor = strServidor
            self.strUsuario = strUsuario
            self.Password = strPassword
            self.ftp =  FTP(strServidor,strUsuario,strPassword)
            self.DirRemoto = self.ftp.pwd()
            self.bolConectado = True
            print(self.ftp.getwelcome())
        except Exception as err:
            self.bolConectado = False
            print("ERROR DE CONEXION")
            print(err)

    def desconecta(self):
        self.ftp.quit()
        self.bolConectado = False

    def dirLocal(self, strDirLocal):
        if not os.path.isdir(strDirLocal):
            os.makedirs(strDirLocal, exist_ok=True)
        os.chdir(strDirLocal)       
    def descarga(self, ruta, filename):
        print("DESCARGAR ", ruta + "/" + filename, " a ", os.getcwd())
        try:
            with open(filename, "wb") as fp:
                self.ftp.retrbinary("RETR " + ruta + "/" + filename, fp.write)
            # print(self.ftp.size(filename))
            # print(os.path.getsize(filename))

        except Exception as e:
            print("Error " + str(e))
            try:
                self.ftp.cwd(ruta + "/" + filename)
                fp.close()
                os.remove(filename)
                os.mkdir(filename)
                os.chdir(filename)
                listaD = self.ftp.nlst()
                for i in range(len(listaD)):
                    self.descarga(self.ftp.pwd(), listaD[i])
                self.ftp.cwd("..")
                os.chdir("..")
            except Exception as e:
                print("Error Download" + str(e))
    def interactivo(self):
        while 1:
            self.listarRemoto()
            self.DirRemoto = self.ftp.pwd()
            self.DirLocal = os.getcwd()
            print("\nFTP  by UCLA")
            print("Servidor:",self.Servidor)
            print("Directorio Local:",self.DirLocal)
            print("Directorio Remoto:",self.DirRemoto)
            #print("\n")
            strOpcion = input("Opción (H ayuda): ")
            if strOpcion.lower() == "q":
                break
            self.evaluaOpcion(strOpcion)
    def evaluaOpcion(self, strOpcion):
        strOpcion = strOpcion.lower().strip()
        dicOpciones = {"ll" : "self.listarLocal()", "lr" : "self.listarRemoto()",
                       "cr" : "self.cdRemoto()",
                       "h" : "self.Ayuda()"
                        }
        if strOpcion[0] == "d":
            if strOpcion[0:3] == "dir":
                self.listarLocal()
            else:
                intOpcion = int(strOpcion.replace("d",""))
                self.descarga(self.ftp.pwd(), self.lstDirectorio[intOpcion][1])
        if strOpcion[0:2] == "..":
            self.ftp.cwd("..")
        if strOpcion.isdigit():
            intOpcion = int(strOpcion)
            try:
                self.ftp.cwd(self.lstDirectorio[intOpcion][1])
            except Exception as e:
                print("Error al cambiar directorio remoto: " + str(e))
        if strOpcion[0:2] == "cd":
            try:
                os.chdir(strOpcion[3:])
            except Exception as e:
                print("error al cambiar directorio local " + str(e))
       
        if strOpcion in dicOpciones.keys():
            eval(dicOpciones[strOpcion])
       
           
    def Ayuda(self):
        print("\nUn poco de AYUDA:")
        print("""
<numero> - Cambia Directorio Remoto
D <numero> - Descarga Archivo/Directorio Remoto
CD <Directorio> - Cambia Directorio Local
DIR - Listar Directorio Local Actual.
Q - Termina Interactivo\n
        """)

    def listarLocal(self):
        for elemento in os.listdir():
            if os.path.isdir(elemento):
                print("\t<DIR>", elemento)
            else:
                print("\t", elemento)

    def listarRemoto(self):
        if self.bolConectado:
            self.lstDir = []
            self.lstDirectorio = []
            self.lstnlst = self.ftp.nlst()
            self.ftp.dir(self.ftp.pwd(), self.lstDir.append)
            for i in range(len(self.lstDir)):
                try:
                    intSize = self.ftp.size(self.lstnlst[i])
                    strType = "F"
                except:
                    intSize = 0
                    strType = "D"
                self.lstDirectorio.append([self.lstDir[i], self.lstnlst[i], strType, intSize])
                print(i,self.lstDirectorio[i][0])
   
    def cdRemoto(self):
        pass



Todavía no sé como insertar la imagen :(

Mientras un ejemplo:
Código: python

objftp = clsFTP()

objftp.conecta("ftp.rediris.es", "anonymous", "guest")
objftp.interactivo()

Hola @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, me encanta que dejes códigos "al aire", así muchas personas pueden aprender.

Primero que nada, colocalo en Github, me gustaria ayudarte y Segundo, sigue leyendo para que veas cómo subir una imagen usando 'Imgurl'.

Primer paso:
    Ingresa a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Segundo paso:
    Sube o arrastra una foto

Tercer paso:
    Una vez se haya subido, mueve el puntero (sin presionar) hacia la imagen que deseas subir y luego en el boton que te aparecera, dale click izquierdo (En caso de que no hayas configurado los botones del mouse para zurdos)

Cuarto paso:
    Copia el link de la imagen, si no te aparece la extensión colocasela y luego usa la etiqueta BBCODE de Underc0de para incrustar la imagen en un post


Quinto y último paso:
    Inserta la dirección y listo.

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

Enero 11, 2020, 04:55:28 PM #2 Ultima modificación: Enero 11, 2020, 05:17:57 PM por darkucla
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Gracias por tu ayuda... espero haber entendido
tengo la aplicación ksnip....


este sería el código en github
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

saludos

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Excelente, cuando tenga un poco de tiempo colaboro con tu código  :D

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF