在ftp网站上找到了每日更新的大约(~600 MB)的zip文件,我创建了一个执行以下操作的脚本:
我的问题是,我是否需要每天下载600MB大小的zip文件来获取.txt文件,我的目的是尝试节省时间和金钱。可能是一个库可以列出zip文件的内容,然后只下载我感兴趣的两个文本文件?
答案 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。