在ftp站点上有一个大约(~600 MB)的每日更新的zip文件,我创建了一个执行以下操作的脚本:
我的问题是,我是否需要每天下载600MB大小的zip文件来获取.txt文件,我的目的是尝试节省时间和金钱。可能是一个库可以列出zip文件的内容,然后只下载我感兴趣的两个文本文件?
它在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())
我怀疑有一个公共可用的库已经为你做了这个。除了那些要求推荐软件库的问题在这里是偏离主题的。所以我改为描述一种如何自己实现这种功能的方法:
FTP实际上没有随机访问权限。您可能做的最多的事情是使用SIZE命令检测文件大小(如果支持),使用REST命令设置文件末尾附近的偏移量,然后使用RETR读取文件末尾。在数据的末尾有一个中心目录,其中包含每个文件的中央目录头,然后包含每个本地文件头所在的偏移量和压缩数据的大小。一旦你发现这些文件是新文件和它们开始的位置,你可以使用REST定位到这个偏移量并使用RETR启动下载。由于FTP没有从文件中只读取特定字节数的命令,因此一旦收到足够的数据,就必须使用ABOR来停止下载。然后,您可以从此下载中提取压缩数据并将其解压缩以获取所需的文件。有关更多信息,请参阅ZIP file format - Structure。