使用python在zip文件中下载ftp文件

时间:2017-01-17 20:45:17

标签: python-2.7 ftp zipfile ftplib

在ftp网站上找到了每日更新的大约(~600 MB)的zip文件,我创建了一个执行以下操作的脚本:

  • 连接到数据ftp站点
  • 下载zip文件(600 MB)
  • 将其解压缩到本地文件夹,找到我感兴趣的zip文件中的一个或两个文本文件。

我的问题是,我是否需要每天下载600MB大小的zip文件来获取.txt文件,我的目的是尝试节省时间和金钱。可能是一个库可以列出zip文件的内容,然后只下载我感兴趣的两个文本文件?

2 个答案:

答案 0 :(得分:1)

它在python 3中,但是在python 2.7中工作不需要太多修改:

注意:这是基于实现的建议,因为FTP服务器没有将提取过程作为标准操作来处理。如果是sshFTP,情况会有所不同。

import zipfile as zf
with zf.ZipFile(filename, 'r') as zfobj:
    for file in zfobj.namelist():
        with zfobj.open(file, 'r') as fobj:
            print(fobj.read())

仅用于获取尚不存在的文件,即;也就是说,文件会附加到zip文件中,而不会被修改

with zf.ZipFile(filename, 'r') as zfobj:
    if set(zfobj.namelist) <= set(os.listdir()):
        pass
    else:
        files = list(set(zfobj.namelist()) - set(os.listdir()))
        for file in files:
            zfobj.extract(file)
            with zfobj.open(file, 'r') as fobj:
                print(fobj.read())

答案 1 :(得分:0)

我怀疑有一个公共可用的库已经为你做了这个。除了那些要求推荐软件库的问题在这里是偏离主题的。所以我改为描述一种如何自己实现这种功能的方法:

FTP实际上没有随机访问权限。您可能做的最多是使用SIZE命令检测文件大小(如果支持),使用REST命令设置文件末尾附近的偏移量,然后使用RETR读取文件末尾。在数据的末尾有一个中心目录,其中包含每个文件的中央目录头,然后包含每个本地文件头所在的偏移量和压缩数据的大小。一旦你发现这些文件是新文件和它们开始的位置,你可以使用REST定位到这个偏移量并使用RETR启动下载。由于FTP没有从文件中只读取特定字节数的命令,因此一旦收到足够的数据,就必须使用ABOR来停止下载。然后,您可以从此下载中提取压缩数据并将其解压缩以获取所需的文件。有关详细信息,请参阅ZIP file format - Structure