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 @You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login, 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 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
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
@You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Gracias por tu ayuda... espero haber entendido
tengo la aplicación ksnip....


este sería el código en github
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

saludos

@You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

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

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF