1

我正在尝试通过 ftp 下载一个 zip 文件,然后在没有实际保存 zip 的情况下提取其中的文件。知道我该怎么做吗?

4

4 回答 4

6

使用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 内存 zip 库

于 2013-01-25T17:35:42.677 回答
4

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

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

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

于 2013-01-25T17:34:49.123 回答
0

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

如果您不需要保存单个文件,而只是访问(即读取)它们,则 zipfile 将允许您执行此操作。

于 2013-01-25T17:33:45.287 回答
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)
于 2020-07-07T05:22:47.137 回答