Python Script Carga de archivos a través de FTP

83

Me gustaría hacer un script para subir un archivo a FTP.

¿Cómo funcionaría el sistema de inicio de sesión? Estoy buscando algo como esto:

ftp.login=(mylogin)
ftp.pass=(mypass)

Y cualquier otra credencial de inicio de sesión.

Codificador de Python frustrado
fuente

Respuestas:

190

Use ftplib, puede escribirlo así:

import ftplib
session = ftplib.FTP('server.address.com','USERNAME','PASSWORD')
file = open('kitten.jpg','rb')                  # file to send
session.storbinary('STOR kitten.jpg', file)     # send the file
file.close()                                    # close file and FTP
session.quit()

Úselo ftplib.FTP_TLSen su lugar si su servidor FTP requiere TLS.


Para recuperarlo, puede utilizar urllib.retrieve:

import urllib 

urllib.urlretrieve('ftp://server/path/to/file', 'file')

EDITAR :

Para averiguar el directorio actual, use FTP.pwd():

FTP.pwd (): Devuelve la ruta del directorio actual en el servidor.

Para cambiar el directorio, use FTP.cwd(pathname):

FTP.cwd (nombre de ruta): establece el directorio actual en el servidor.

KZ
fuente
@DawsonHensel Puede usar print ftp.pwd()le mostrará la ruta actual en la que se encuentra.
KZ
hay un comportamiento extraño, puedo ftp a mi servidor desde la línea de comandos y cargar el archivo, pero no con ftplib, la conexión está abierta por un tiempo y luego aparece un error de socket. Cuál podría ser la razón ?
89n3ur0n
16

ftplib ahora admite administradores de contexto, así que supongo que se puede hacer aún más fácil

from ftplib import FTP
from pathlib import Path

file_path = Path('kitten.jpg')

with FTP('server.address.com', 'USER', 'PWD') as ftp, open(file_path, 'rb') as file:
        ftp.storbinary(f'STOR {file_path.name}', file)

No es necesario cerrar el archivo o la sesión

gbonetti
fuente
1
Si alguien tiene problemas para cargar un archivo desde Windows a un servidor FTP usando la respuesta aceptada, este método funcionó para mí.
mKane848
5

Lo más probable es que desee utilizar el módulo ftplib para python

 import ftplib
 ftp = ftplib.FTP()
 host = "ftp.site.uk"
 port = 21
 ftp.connect(host, port)
 print (ftp.getwelcome())
 try:
      print ("Logging in...")
      ftp.login("yourusername", "yourpassword")
 except:
     "failed to login"

Esto lo conecta a un servidor FTP. Lo que hagas a partir de ahí depende de ti. Su pregunta no indica ninguna otra operación que realmente deba realizarse.

Tadgh
fuente
Tadgh, gracias. La principal preocupación que tengo es hacer algo simple que me registre y me permita cargar los archivos necesarios. Perdón por ser tan vago.
Codificador de Python frustrado
2
Esto no responde la pregunta
Jorge Leitao
4

Prueba esto:

#!/usr/bin/env python

import os
import paramiko 
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostname', username="username", password="password")
sftp = ssh.open_sftp()
localpath = '/home/e100075/python/ss.txt'
remotepath = '/home/developers/screenshots/ss.txt'
sftp.put(localpath, remotepath)
sftp.close()
ssh.close()
Anand
fuente
4
La pregunta es sobre la transferencia de archivos a través de FTP, no SFTP.
Sam Hosseini
De acuerdo, a menudo aparece un SSHException: Error reading SSH protocol banner" when using ProxyCommanderror al seguir esta ruta en ftp.
Benloper
0

Acabo de responder una pregunta similar aquí en mi humilde opinión, si su servidor FTP puede comunicarse con Fabric, por favor, envíenos a Fabric. Es mucho mejor que hacerlo crudo ftp.

Tengo una cuenta FTP de, por dotgeek.comlo que no estoy seguro de si funcionará con otras cuentas FTP.

#!/usr/bin/python

from fabric.api import run, env, sudo, put

env.user = 'username'
env.hosts = ['ftp_host_name',]     # such as ftp.google.com

def copy():
    # assuming i have wong_8066.zip in the same directory as this script
    put('wong_8066.zip', '/www/public/wong_8066.zip')

guarde el archivo como fabfile.pyy ejecútelo fab copylocalmente.

yeukhon@yeukhon-P5E-VM-DO:~$ fab copy2
[1.ai] Executing task 'copy2'
[1.ai] Login password: 
[1.ai] put: wong_8066.zip -> /www/public/wong_8066.zip

Done.
Disconnecting from 1.ai... done.

Una vez más, si no desea ingresar la contraseña todo el tiempo, simplemente agregue

env.password = 'my_password'
CppLearner
fuente
1
A menos que me falte algo en la documentación de los tejidos, el tejido no es compatible con FTP. Probablemente tenga la suerte de que dotgeek.com admita SSH y FTP, utilizando las mismas credenciales.
Epcylon
@Epcylon Fabric admite SFTP - While the SFTP protocol (which put uses) enlace
Alex L
2
@AlexL Correcto, pero SFTP no es de ninguna manera lo mismo que FTP. Son dos protocolos diferentes para el mismo propósito, pero si necesita conectarse a un servidor FTP, no puede usar un cliente SFTP y viceversa. De wikipedia : "SFTP no es FTP ejecutado sobre SSH, sino más bien un nuevo protocolo diseñado desde cero por el grupo de trabajo IETF SECSH ".
Epcylon
@Epcylon ¡Sí! Solo trato de aclarar qué usa Fabric. Con suerte, el OP (o los futuros lectores) pueden enviar SFTP a sus servidores en lugar de usar FTP, la estructura es bastante útil.
Alex L
0

Para evitar el error de cifrado, también puede probar los siguientes comandos

ftp = ftplib.FTP_TLS("ftps.dummy.com")
ftp.login("username", "password")
ftp.prot_p()
file = open("filename", "rb")
ftp.storbinary("STOR filename", file)
file.close()
ftp.close()

ftp.prot_p () asegúrese de que sus conexiones estén encriptadas

Shishir
fuente
-1

Puede utilizar la siguiente función. Aún no lo he probado, pero debería funcionar bien. Recuerde que el destino es una ruta de directorio donde la fuente es la ruta completa del archivo.

import ftplib
import os

def uploadFileFTP(sourceFilePath, destinationDirectory, server, username, password):
    myFTP = ftplib.FTP(server, username, password)
    if destinationDirectory in [name for name, data in list(remote.mlsd())]:
        print "Destination Directory does not exist. Creating it first"
        myFTP.mkd(destinationDirectory)
    # Changing Working Directory
    myFTP.cwd(destinationDirectory)
    if os.path.isfile(sourceFilePath):
        fh = open(sourceFilePath, 'rb')
        myFTP.storbinary('STOR %s' % f, fh)
        fh.close()
    else:
        print "Source File does not exist"
Debasish Mitra
fuente
En myFTP.storbinary('STOR %s' % f, fh)lo que es % f?
Hrvoje T
@HrvojeT No crea que% f sea necesario, ya que está configurado como predeterminado. Para obtener más detalles, consulte este ftpguide.com/STRU.htm
Debasish Mitra
¿Qué es remoto?
dijo el