使用ftplib下载部分文件

问题描述:

有没有办法从最后一行(文件结束)只下载部分文件。就像文件超过40 MB一样,我想只检索最后一块,比如说2042字节。有没有可能通过ftplib使用python 3来做到这一点?使用ftplib下载部分文件

+0

不,据我所知,由于我们下载和接收数据包的方式,不可能这样做。但是,您可以流式传输文件,然后只读最后几个块。有关更多详细信息,请参阅[本答案](https://*.com/a/18773444/8381175)。 –

尝试使用FTP.retrbinary()方法并提供rest参数,它是所需文件的偏移量。由于偏移量是从文件的开头开始的,因此需要使用文件大小和所需数据字节数来计算偏移量。下面是一个例子使用Debian的FTP服务器:

from ftplib import FTP 

hostname = 'ftp.debian.org' 
filename = 'README' 
num_bytes = 500    # how many bytes to retrieve from end of file 

ftp = FTP(hostname) 
ftp.login() 
ftp.cwd('debian') 

cmd = 'RETR {}'.format(filename) 
offset = max(ftp.size(filename) - num_bytes, 0) 
ftp.retrbinary(cmd, open(filename, 'wb').write, rest=offset) 

ftp.quit() 

这将检索请求的文件末尾的最后num_bytes字节,并将其写入到当前目录下的同名文件。

retrbinary()的第二个参数是回调函数,在这种情况下,它是可写入文件的write()方法。您可以编写自己的回调来处理检索到的数据。

+0

谢谢,这真的很有帮助 – Nastyjoe

只需使用retrbinaryrest参数告诉服务器应该开始传输数据的文件偏移量。从documentation

FTP.retrbinary(命令,回调[,maxblocksize [,休息]])
...其余意味着同样的事情在transfercmd()方法。

FTP.transfercmd(cmd [,rest])
...如果给出可选休息,则将REST命令发送到服务器,将rest作为参数传递。休息通常是一个字节偏移到请求的文件,告诉服务器重新开始发送文件的字节在请求的偏移量,跳过最初的字节。