【问题标题】:Downloading partial file with ftplib使用 ftplib 下载部分文件
【发布时间】:2017-10-13 10:27:33
【问题描述】:

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

【问题讨论】:

  • 不,据我所知,由于我们下载和接收数据包的方式,不可能这样做。但是,您可以流式传输文件,然后只读取最后几个块。详情请参阅this answer

标签: python python-3.x ftp ftplib


【解决方案1】:

尝试使用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() 方法。您可以编写自己的回调来处理检索到的数据。

【讨论】:

    【解决方案2】:

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

    FTP.retrbinary(command, callback[, maxblocksize[, rest]])
    ... rest 与 transfercmd() 方法中的含义相同。

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

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 2010-12-20
      • 2012-07-19
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      相关资源
      最近更新 更多