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

问题描述 投票:1回答:2

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

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

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

python-2.7 ftp zipfile ftplib
2个回答
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())

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.