通过FTP下载zip文件,并在Python中提取内存中的文件

时间:2013-01-25 17:18:35

标签: python ftp zip

我正在尝试通过ftp下载一个zip文件,但是然后在没有实际保存zip的情况下解压缩文件。知道我是怎么做的吗?

4 个答案:

答案 0 :(得分:5)

使用zipfile.open

它会将存档中的成员打开到内存中。由于ZipFile接受任何类似文件的对象作为参数,因此您可以从许多来源获取它,例如HTTP / FTP服务器

import urllib
import io
from zipfile import ZipFile

mysock = urllib.urlopen('ftp://ftp.yourhost.com/spam.zip')  // check urllib for parameters
memfile = io.BytesIO(mysock.read())
with ZipFile(memfile, 'r') as myzip:
    f = myzip.open('eggs.txt')
    content = f.read()  // or other file-like commands

同时检查Python in-memory zip library

答案 1 :(得分:4)

ftplib模块允许通过FTP下载文件。

zipfile模块允许从zip文件中提取文件。

这是密钥,io.BytesIO类允许您将内存中的字节传递给任何需要文件的内容。 (在Python 2.x中,StringIO模块提供了类似的功能。)

答案 2 :(得分:0)

zipfile模块可用于从zip文件中提取内容; ftplib将用于访问zipfile。不幸的是,ftplib没有为zipfile提供类似文件的对象来用来访问文件的内容。我想你可以读一下拉链&将它存储在内存中,例如以字符串形式存储,然后可以将其包装在类似文件的对象(StringIO)中,尽管您仍然可以获取整个zip,而不是将其保存到磁盘。

如果您不需要保存单个文件,只需访问(即读取)它们,zipfile就可以执行此操作。

答案 3 :(得分:0)

我找不到直接提取文件的可能方法,但这是替代方法:

首先,从FTP下载文件

ftp =ftplib.FTP(FtpServer)          #connect to the ftp server
ftp.login(ServerUser,ServerPwd)     #using your credentials here

filedata = open(os.path.join(destination,DowloadedFileName),'wb')
ftp.retrbinary('RETR '+SourceFilename,filedata.write)      
filedata.close()
ftp.quit()

第二,从zip提取文件:

path_to_zip_file = os.path.join(destination,DowloadedFileName)
directory_to_extract_to = destination
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
    zip_ref.extractall(directory_to_extract_to)
           

最后,删除下载的zip文件

os.remove(path_to_zip_file)

希望有帮助:) 干杯!