[Python] Subir archivos a ftp.. ¿Por qué carajos pasa esto?

Iniciado por GreenTick, 24 Agosto 2016, 01:45 AM

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

GreenTick

Buenas a to2! Como siempre, primero comentaré mi caso y despues expondré mis preguntas....

Llevo unos días dandole al python aver si avanzo algo..; he comenzado un proyecto.. (quizás a mucha gente le resultará inutil; ami me fascina) de crear un Administrador de Archivos con algunas funciones guapas...
En si; no es un administrador de archivos por comandos tán rudimentario como el que incluye la CMD con los comandos cd..ls..etc (aunque los usa en el código)
En si; es un administrador de archivos de fácil utilidad; te marca las opciones en un menú y los archivos cada uno con una id... algo bastante fácil...

He creado ya la opción de entrar en ficheros; y el de ir a la carpeta principal (/) .en un principio será para windows y linux; sólo que esta hecho mas que nada para ir tirando en linux. (Por la raíz)

Seguramente; mis técnicas de programacion seran muy novatas para vuestro nivel; ya que no llevo ni un mes en python.. pero espero que podáis entender el codigo...

Ahora expongo mi pregunta!!
El caso es; que quería implementar la opcion 6; que es la de subir un archivo a un servidor FTP. tengo montado un servidor FTP; y he creado un script aparte; en otro archivo, el cual me sube los archivos al servidor FTP sin ningun problema. el caso; es que cuando lo he ido a meter a la opcion 6 (if opcion_administrador == '6') me salta el siguiente error:

CitarFile "Explorador.py", line 140, in <module>
   ftp.storlines('STOR %s'%nombre_archivo, open(nombre_archivo, 'r'))
TypeError: an integer is required

A continuación os dejo los códigos para que los probeis vosotros mismos. Cambien IP y PORT por la ip y el puerto del servidor; y USER Y PASS por la contraseña.. (por si las moscas eje eje)

¡CODIGO DEL SCRIPT QUE SUBE UNICAMENTE ARCHIVO AL FTP¡ (funciona)
from ftplib import FTP
from subprocess import call

nombre_archivo = str(raw_input('Introduce la raiz completa del archivo (EJ: /root/Escritorio/archivo.txt)'))
ftp = FTP()
ftp.connect('ip', port, -999)
ftp.login('user', 'pass')
ftp.storlines('STOR %s'%nombre_archivo, open(nombre_archivo, 'r'))






¡CODIGO DEL PROGRAMA ENTERO QUE SALTA EL ERROR ANTERIORMENTE MENCIONADO AL PULSAR LA OPCION 6 E INTRODUCIR LA RUTA! (En negrita donde surge el error)

# -*- coding: utf-8 -*-
from ftplib import FTP
from os import *
from subprocess import *
from sys import *


espacio = ' '
gbajo = '_'
v = version

# Pantalla de inicio
print "Bienvenido a la beta cerrada del explorador de archivos"
print "Desarrollado por la comunidad abierta 8noobs"
print "más info en: www.8noobs.hol.es"
print "\nTu versión de python es:\n%s"%v
pausa = raw_input('\tpulsa enter para continuar')

# Comienza el programa
system("clear")
## En esta parte pregunta la version, es muy importante
print 'Termina de configurar el Explorador para que funcione correctamente.'
sistema_operativo = str(raw_input('Introduce "windows" o "linux dependiendo de tu sistema operativo\t'))
while sistema_operativo != 'linux' and sistema_operativo != 'windows':
   sistema_operativo = str(raw_input('Introduce "windows" o "linux"'))
if sistema_operativo == 'linux':
   raiz = '/'
   seguir = str(raw_input('Quiere escanear los archivos del directorio raíz?\t'))
elif sistema_operativo == 'windows':
   raiz = 'C:\\'   #Creo que aqui esta mal. testear en windows
   seguir = str(raw_input('Quiere escanear los archivos del directorio raíz?\t'))
###Ahora ya ha elegido variable a sistema_operativo, y dependiendo de cual
###eligira la raiz correcta; y la introducira en la variable raiz

# Aqui comienza el bucle del programa
while seguir == 'si':
   call('clear')
   print '###################################################################'
   print '#Raiz actual: %s#'%raiz
   print '##################################################################'
   proceso = Popen(['ls',raiz], stdout=PIPE, stderr=PIPE)
   error_econtrado = proceso.stderr.read()
   proceso.stderr.close()
   listado_string = proceso.stdout.read()
   proceso.stdout.close()
   listado_lista = listado_string.split('\n')
   clave_archivo = 0


## Bien, vamos a ver. lo que hace esto es hacer un clear en pantalla
## despues se ejecuta el comando ls con su respectiva raiz
## C: o / dependiendo del sistema. aunque mas adelante se le añadira mas
## a la raiz. despues retorna el resultado de ls+raiz a un string unico llamado
##listad_string y separa el contenido en una lista en la variable listado_lista

####Ahora viene la acción de enseñar los archivos en pantalla


   for nombre_archivo in listado_lista:
       if clave_archivo == 0:
           print '0 ) -> %s'%listado_lista[0]
           clave_archivo += 1
       else:
           print '%d ) -> %s'%(clave_archivo,nombre_archivo)
           clave_archivo += 1

   cantidad_archivos = len(listado_lista)
   print 'se han encontrado %s archivos y/o directorios \n(el ultimo numero representa al directorio padre)'%cantidad_archivos
##### Aqui ya habrá mostrado los archivos. ahora debe aparecer el menu para elegir
##### la opción deseada. Entre ellas estará entrar en un directorio

###Aquí se muestra el menú de opciones despues de escanear los archivos
   print ''
   print '##################################'
   print '##  Opciones del administrador  ##'
   print '##################################'
   print ''
   print '1) Entrar en un directorio'
   print '2) Ir a la carpeta principal'
   print '3) Copiar un archivo en una ruta absoluta'
   print '4) ver permisos de un archivo/directorio'
   print '5) cambiar permisos de un archivo/directorio'
   print '6) Enviar archivo a servidor FTP'
   opcion_administrador = str(raw_input('-> Introduce el numero de la opcion elegida: '))

## En la linea de arriba, pide el valor de la variable opcion_administrador.
## dependiendo de ese valor, ejecutara una opcion del menu u otra

######### Opcion 1
   if opcion_administrador == '1':
       directorio_elegido = int(raw_input('Introduce el nombre del archivo a entrar:\t'))

######### Si el numero introducido es el ultimo archivo, borrará la variable ultimo_archivo
######### La variable ultimo_archivo se almacena una vez entras en un archivo.
######### Hay que pensar una manera mejor, para poder almacenar todas las partes
######### de la raiz y asi poder ir hacia atras desde cualquier carpeta
######### (por ahora solo se puede ir hacia atras una vez, ya que solo se almacena una vez
######### la variable ultimo_archivo
       if directorio_elegido == cantidad_archivos-1:
           print 'se eliminara el siguiente archivo de la ruta "%s"'%ultimo_archivo
           raiz = raiz.strip(ultimo_archivo)
########### y si el numero de directorio es un directorio real,se añadira / o \ ependiendo de
########### si es windows o linux, y seguidamente se le añadira el directorio elegido al string
########### de la variable raiz. para cuando se vuelva a repetir el bucle while del principio
########### Esta vez, haga el comando "ls" dentro de la raiz dictada nuevamente
       else:
           if sistema_operativo == 'linux':
               raiz += '/'
           elif sistema_operativo == 'windows':
               raiz += '\\'
           ### aqui hay que poner bien el separador de windows, no se si lo coloque bien
           raiz += listado_lista[directorio_elegido]
           ultimo_archivo = listado_lista[directorio_elegido]
       raiz = str(raiz)
       print 'El directorio seleccionado es "%s"'%listado_lista[directorio_elegido]
       seguir = str(raw_input('pulse enter para continuar'))
       seguir = 'si'



#########opcion 2
   if opcion_administrador == '2':
       if sistema_operativo == 'linux':
               raiz = '/'
       elif sistema_operativo == 'windows':
               raiz = 'C:\\'





######### Opcion 6


[b] if opcion_administrador == '6':
       nombre_archivo = str(raw_input('Introduce la raiz completa del archivo (EJ: /root/Escritorio/archivo.txt)'))
       ftp = FTP()
       ftp.connect('ip', port, -999)
       ftp.login('user'', 'pass')
       ftp.storlines('STOR %s'%nombre_archivo, open(nombre_archivo, 'r'))[/b]





os dejo un video del script por si alguien no lo entiende como va...
[youtube=640,360]https://www.youtube.com/watch?v=j9aPPkrlfNM[/youtube]
8Noobs - Más que una comunidad; una familia.
www.telegram.me/proyecto8NOOBS

Ser humilde, significa entender que algún día podrás ver al de arriba bajo tus pies; y al que te esta lamiendo las suelas saltando encima tuya.

Aelium_Kah

Muy buenas Green. Por alguna razón que se me escapa la linea:
ftp.storlines('STOR %s'%nombre_archivo, open(nombre_archivo, 'r'))
da error con respecto al nombre de archivo, supongo porque estás metiendo toda la ruta del nombre como por ejemplo
/home/user/leeme.txt y da error. Mi recomendacion de codigo es esta:



if opcion_administrador == '6':
        nombre_archivo = str(raw_input('Introduce la raiz completa del archivo (EJ: /root/Escritorio/archivo.txt)'))
        nombre_remoto = str(raw_input('Introduce el nombre remoto de archivo:'))
        ftp = FTP()
        ftp.connect('ip', port, -999)
        ftp.login('user'', 'pass')
        ftp.storlines('STOR " + nombre_remoto, open(nombre_archivo, 'r'))




Espero que te sirva ;)

GreenTick

Muchas gracias compañero!
un saludo y nos vemos por telegram!  ;-)
8Noobs - Más que una comunidad; una familia.
www.telegram.me/proyecto8NOOBS

Ser humilde, significa entender que algún día podrás ver al de arriba bajo tus pies; y al que te esta lamiendo las suelas saltando encima tuya.