Как загрузить файл по FTP с помощью Python ftplib

У меня есть следующий код, который легко подключается к FTP-серверу и открывает zip-файл. Я хочу загрузить этот файл в локальную систему. Как это сделать?

# Open the file for writing in binary mode
print 'Opening local file ' + filename
file = open(filename, 'wb')

# Download the file a chunk at a time
# Each chunk is sent to handleDownload
# We append the chunk to the file and then print a '.' for progress
# RETR is an FTP command

print 'Getting ' + filename
ftp.retrbinary('RETR ' + filename, handleDownload)

# Clean up time
print 'Closing file ' + filename
file.close()

person Intekhab Khan    schedule 20.07.2012    source источник
comment
Я предлагаю использовать здесь with, который позаботится о закрытии дескриптора файла, когда это будет сделано: with open(filename, "wb") as file: ftp.retrbinary("RETR " + filename, file.write)   -  person Lekensteyn    schedule 24.06.2013
comment
Утечки FD - это не шутки! Пока вы это делаете, вы можете переименовать file в f, поскольку file затеняет встроенный file.   -  person pnovotnak    schedule 09.07.2015
comment
используйте retrlines, если файл является текстовым.   -  person Jossie Calderon    schedule 19.07.2016


Ответы (7)


FILENAME = 'StarWars.avi'    

with ftplib.FTP(FTP_IP, FTP_LOGIN, FTP_PASSWD) as ftp:
    ftp.cwd('movies')
    with open(FILENAME, 'wb') as f:
        ftp.retrbinary('RETR ' + FILENAME, f.write)

Конечно, было бы разумно обработать возможные ошибки.

person RdB    schedule 27.09.2016
comment
как получить доступ к этому файлу? Допустим, у меня есть файл csv на моем ftp, который я хочу открыть и сохранить как фрейм данных, как мне это сделать? - person LOKE2707; 08.07.2019

Модуль ftplib в стандартной библиотеке Python можно сравнить с ассемблером. Используйте библиотеку высокого уровня, например: https://pypi.python.org/pypi/ftputil.

person guettli    schedule 20.01.2015

Обратите внимание, если вы загружаете с FTP на локальный компьютер, вам нужно будет использовать следующее:

with open( filename, 'wb' ) as file :
        ftp.retrbinary('RETR %s' % filename, file.write)

В противном случае сценарий будет находиться в вашем локальном файловом хранилище, а не на FTP.

Я сам несколько часов допустил ошибку.

Скрипт ниже:

import ftplib

# Open the FTP connection
ftp = ftplib.FTP()
ftp.cwd('/where/files-are/located')


filenames = ftp.nlst()

for filename in filenames:

    with open( filename, 'wb' ) as file :
        ftp.retrbinary('RETR %s' % filename, file.write)

        file.close()

ftp.quit()
person JDavies    schedule 02.01.2019

Это код Python, который мне подходит. Комментарии на испанском языке, но приложение легко понять

# coding=utf-8

from ftplib import FTP                                                                      # Importamos la libreria ftplib desde FTP

import sys

def imprimirMensaje():                                                                      # Definimos la funcion para Imprimir el mensaje de bienvenida
    print "------------------------------------------------------"
    print "--               COMMAND LINE EXAMPLE               --"
    print "------------------------------------------------------"
    print ""
    print ">>>             Cliente FTP  en Python                "
    print ""
    print ">>> python <appname>.py <host> <port> <user> <pass>   "
    print "------------------------------------------------------"

def f(s):                                                                                   # Funcion para imprimir por pantalla los datos 
    print s

def download(j):                                                                            # Funcion para descargarnos el fichero que indiquemos según numero    
    print "Descargando=>",files[j]      
    fhandle = open(files[j], 'wb')
    ftp.retrbinary('RETR ' + files[j], fhandle.write)                                       # Imprimimos por pantalla lo que estamos descargando        #fhandle.close()
    fhandle.close()                                                     

ip          = sys.argv[1]                                                                   # Recogemos la IP       desde la linea de comandos sys.argv[1] 
puerto      = sys.argv[2]                                                                   # Recogemos el PUERTO   desde la linea de comandos sys.argv[2]
usuario     = sys.argv[3]                                                                   # Recogemos el USUARIO  desde la linea de comandos sys.argv[3]
password    = sys.argv[4]                                                                   # Recogemos el PASSWORD desde la linea de comandos sys.argv[4]


ftp = FTP(ip)                                                                               # Creamos un objeto realizando una instancia de FTP pasandole la IP
ftp.login(usuario,password)                                                                 # Asignamos al objeto ftp el usuario y la contraseña

files = ftp.nlst()                                                                          # Ponemos en una lista los directorios obtenidos del FTP

for i,v in enumerate(files,1):                                                              # Imprimimos por pantalla el listado de directorios enumerados
    print i,"->",v

print ""
i = int(raw_input("Pon un Nº para descargar el archivo or pulsa 0 para descargarlos\n"))    # Introducimos algun numero para descargar el fichero que queramos. Lo convertimos en integer

if i==0:                                                                                    # Si elegimos el valor 0 nos decargamos todos los ficheros del directorio                                                                               
    for j in range(len(files)):                                                             # Hacemos un for para la lista files y
        download(j)                                                                         # llamamos a la funcion download para descargar los ficheros
if i>0 and i<=len(files):                                                                   # Si elegimos unicamente un numero para descargarnos el elemento nos lo descargamos. Comprobamos que sea mayor de 0 y menor que la longitud de files 
    download(i-1)                                                                           # Nos descargamos i-1 por el tema que que los arrays empiezan por 0 
person Iker    schedule 09.08.2015
comment
Спасибо, это очень помогло мне начать работу с файлами, даже с комментариями в espanol :) - person chuckjones242; 05.02.2017

Если вы не ограничены использованием ftplib, вы также можете попробовать wget модуль. Вот фрагмент

import wget
file_loc = 'http://www.website.com/foo.zip'
wget.download(file_loc)
person Gaurav Shrivastava    schedule 19.10.2020

person    schedule
comment
мог бы использовать некоторый контекст. в идеале, как упоминают другие, вы вызываете эту команду внутри оператора with, чтобы управлять дескрипторами файлов и автоматически закрывать ее для вас! - person chill_turner; 29.01.2018
comment
Как прокомментировал @chill_turner, это даже не закрывает локальный файл. В качестве надежного примера см. ответ @RdB. - person Martin Prikryl; 18.04.2021

person    schedule
comment
что я в open (i, 'wb'). write? - person LOKE2707; 08.07.2019
comment
@ LOKE2707 это было имя файла, объявленное в первой строке. Я изменил это. Спасибо, что заметили это - person Mathias711; 19.09.2019
comment
Спасибо, в основном за пример, использующий «попробовать». Помогите мне очень! - person Mateus da Silva Teixeira; 23.07.2020