是否可以直接从存储在 S3 上的 zip 文件中读取特定文件?

Posted

技术标签:

【中文标题】是否可以直接从存储在 S3 上的 zip 文件中读取特定文件?【英文标题】:Is it possible to read a specific file directly from a zip file that is stored on S3? 【发布时间】:2021-01-31 15:34:50 【问题描述】:

我在名为big.zip 的压缩文件中有一个名为story.txt 的文件,该文件存储在名为zips-bucket 的S3 存储桶中。

我希望我的 Python 代码仅读取 story.txt 的内容,而无需下载甚至扫描整个大 zip 文件。是否可以?怎么样?

【问题讨论】:

【参考方案1】:

不,在您的特定情况下这是不可能的。但是,S3 提供了一个名为S3 Select 的功能,如果满足某些要求,它可以选择性地读取文件的一部分。您可以查看文档。

【讨论】:

您可以读取存储在 S3 中的 zip 文件中的对象。 zip 在文件末尾存储一个目录。读取目录,查找文件和偏移量。然后读取从该偏移量开始的对象的长度字节。这需要编写代码,但很容易做到。【参考方案2】:

是的,这是可能的。您将需要导入 smart-openzipfile 模块。假设您的压缩文件位于s3://zips-bucket/big.zip。执行以下操作:

import smart_open as so
import zipfile

with so.open('s3://zips-bucket/big.zip', 'rb') as file_data
  with zipfile.ZipFile(file_data) as z:
    with z.open('story.txt') as zip_file_data:
      story_lines = zip_file_data.readlines()

应该这样做!

【讨论】:

以上是关于是否可以直接从存储在 S3 上的 zip 文件中读取特定文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将.zip数据导入neo4j?

从 s3 存储桶获取 2 个文件,并在使用 lambda 节点 js 将其上传到 s3 存储桶后制作 1 个 zip 文件

使用带有 Node.js 的 AWS Lambda 函数从 S3 存储桶中提取 zip 文件并上传到另一个存储桶

S3 存储桶上的未加密文件是不是有 Etag?

使用 s3cmd 问题从 s3 下载 zip 文件

Python 脚本作为 AWS S3 存储桶上的 Cron