【问题标题】:Download zip file via FTP and extract files in memory in Python通过 FTP 下载 zip 文件并在 Python 中提取内存中的文件
【发布时间】:2013-01-09 17:22:39
【问题描述】:

我正在尝试通过 ftp 下载一个 zip 文件,但随后将其中的文件解压缩,而实际上并未保存该 zip。知道我该怎么做吗?

【问题讨论】:

    标签: python ftp zip


    【解决方案1】:

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

    首先,从 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)
    

    【讨论】:

      【解决方案2】:

      使用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

      【讨论】:

      • 比起我的回答,我更喜欢这种方法。
      • :) 但请注意它未经测试...我正在用我的智能手机写作
      • 现在我测试了它,它可以工作了。但是,Jon-Eric,您的方法是正确的。所以我编辑了我的代码:我们必须将“mysock”内容包装到一个 BytesIO 对象中,否则 ZipFile 会抱怨无法检索文件大小。
      【解决方案3】:

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

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

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

      【讨论】:

      • 我知道这是旧的。但这对我不起作用。 buf = io.BytesIO(str.encode("Test data to write")) buf = ZipFile.ZipFile(buf, mode='x') ftp.storbinary("STOR " + self.filename, buf) 它给我一个错误:KeyError:'存档中没有名为 8192 的项目'
      • 我在这里提供更多信息stackoverflow.com/questions/51358672/…
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 1970-01-01
        • 2012-10-04
        相关资源
        最近更新 更多