如何使用 Python ftplib 通过 FTP 下载文件
Posted
技术标签:
【中文标题】如何使用 Python ftplib 通过 FTP 下载文件【英文标题】:How to download a file via FTP with Python ftplib 【发布时间】:2012-07-19 09:41:15 【问题描述】:我有以下代码可以轻松连接到 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()
【问题讨论】:
我建议在这里使用with
,它负责在完成后关闭文件句柄:with open(filename, "wb") as file: ftp.retrbinary("RETR " + filename, file.write)
FD 泄露可不是开玩笑的!当您使用它时,您可以将file
重命名为f
,因为file
会影响内置的file
。
如果文件是文本文件,则使用retrlines
。
【参考方案1】:
handle = open(path.rstrip("/") + "/" + filename.lstrip("/"), 'wb')
ftp.retrbinary('RETR %s' % filename, handle.write)
【讨论】:
可以使用一些上下文。理想情况下,正如其他人提到的那样,您在with
语句中调用此命令来管理您的文件描述符并自动为您关闭它!
正如@chill_turner 评论的那样,这甚至不会关闭本地文件。有关可靠示例,请参阅the answer by @RdB。【参考方案2】:
A = filename
ftp = ftplib.FTP("IP")
ftp.login("USR Name", "Pass")
ftp.cwd("/Dir")
try:
ftp.retrbinary("RETR " + filename ,open(A, 'wb').write)
except:
print "Error"
【讨论】:
open(i,'wb').write 中的 i 是什么? @LOKE2707 它是文件名,在第一行中声明。我改变了它。感谢您的关注 谢谢,主要是使用'try'的例子。帮帮我!【参考方案3】: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)
当然,处理可能的错误是明智之举。
【讨论】:
如何访问该文件?假设我的 ftp 中有一个 csv 文件,我想打开并存储为数据框,我该怎么做?【参考方案4】:Python 标准库中的ftplib
模块可以比作汇编程序。使用高级库,例如:https://pypi.python.org/pypi/ftputil
【讨论】:
源代码托管在作者的个人域上,pypi 上没有自述文件。去年发布了一些版本,所以看起来保持不变,+1。但是该网站(文档)看起来很旧而且有点笨拙,-1。作者是否为您或社区所认识? Python 很大,所以任何子社区都可以。【参考方案5】:请注意,如果您是从 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()
【讨论】:
这适用于较小尺寸的文件,但对于较大尺寸的文件,整个事情似乎卡住了。你知道怎么解决吗?【参考方案6】:这是一个对我来说运行良好的 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
【讨论】:
谢谢,这对我开始处理文件很有帮助,即使是在西班牙语中使用 cmets :)【参考方案7】:如果你不限于使用ftplib
,你也可以试试wget
模块。这里是sn-p
import wget
file_loc = 'http://www.website.com/foo.zip'
wget.download(file_loc)
【讨论】:
以上是关于如何使用 Python ftplib 通过 FTP 下载文件的主要内容,如果未能解决你的问题,请参考以下文章