使用boto3和python从Amazon s3读取zip文件

哈克希尔

我有一个s3存储桶,其中没有大量的压缩文件(以GB为单位)。我需要计算所有zip文件的数据长度。我通过boto3,但没有听懂。我不确定它是否可以直接读取zip文件,但是我有一个过程-

  1. 与水桶连接。
  2. 从bucket文件夹(假设文件夹是Mydata)中读取zip文件。
  3. 将zip文件解压缩到另一个名为Extracteddata的文件夹中。
  4. 读取Extracteddata文件夹并对文件执行操作。

注意:所有内容都不应下载到本地存储中。所有过程都在S3到S3上进行。任何建议表示赞赏。

阿巴内特

正如约翰·罗滕斯坦John Rotenstein)的回答所解释的,您要做的是不可能您必须使用本地带宽将zipfile下载-不一定要下载到本地存储,但至少要下载到本地内存无法在S3上运行任何代码。

但是,无论如何,也许有一种方法可以使您真正获得满意的结果。

例如,如果您可以下载价值8KB的文件,而不是整个5GB的文件,那就足够了吗?如果是这样,并且您愿意做一些工作,那么您很幸运。如果您必须下载例如1MB,但可以减少很多工作,该怎么办?


如果1MB听起来还不错,并且您愿意接受一些技巧:

您唯一想要的是计算zip文件中有多少个文件。对于zipfile,所有这些信息都可以在中央目录中找到,而在文件的末尾只有一小部分数据。

而且,如果您拥有整个中央目录,即使您丢失了文件的其余部分,zipfilestdlib中模块也可以很好地处理它。它不记录这样做,但是,至少在包括在最近的CPython的和PyPy 3.x中,肯定会在版本。

因此,您可以执行以下操作:

  • HEAD发出仅获取标题请求。(在中boto,您可以使用进行此操作head_object。)
  • Content-Length标题中提取文件大小
  • GET发出带有Range标头请求,例如仅从头下载size-1048576到最后。(在中boto,我相信您可能必须调用get_object而不是download*便捷方法之一,并且必须自己格式化Range标题值。)

现在,假设您在缓冲区中有最后1MB的空间buf

z = zipfile.ZipFile(io.BytesIO(buf))
count = len(z.filelist)

通常,1MB绰绰有余。但是什么时候不是呢?好吧,这里的东西有些古怪。zipfile模块知道您还需要多少字节,但是唯一可以提供信息的地方是异常描述的文本。所以:

try:
    z = zipfile.ZipFile(io.BytesIO(buf))
except ValueError as e:
    m = re.match(r'negative seek value -(\d+)', z.args[0])
    if not m:
        raise
    extra = int(m.group(1))
    # now go read from size-1048576-extra to size-1048576, prepend to buf, try again
count = len(z.filelist)

如果1MB的带宽听起来已经太多了,或者您不想依靠该zipfile模块未记录的行为,则只需做更多的工作。

在几乎所有情况下,你甚至都不需要整个中央目录,就在total number of entries该领域内,end of central directory record在中央目录的最后数据的-an更小的块。

因此,执行与上述相同的操作,但只读取最后8KB而不是最后1MB。

然后,根据zip格式规范,编写自己的解析器。

当然,您不需要编写一个完整的解析器,甚至不需要编写一个完整的解析器。您只需要足够的内容来处理从头到尾的字段total number of entrieszip64 extensible data sector和/或外,所有字段均为固定大小的字段.ZIP file comment

有时(例如,对于带有大量注释的zip文件),您将需要读取更多数据以获取计数。这应该很少见,但是如果由于某种原因在zip文件中更常见,则可以将8192猜测值更改为更大的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从S3读取ZIP文件,而无需下载整个文件

使用python boto3在Amazon S3中创建目录

列出使用Python和Boto3的S3存储桶的目录内容吗?

使用Boto3从S3存储桶读取文件内容

使用boto3,Python从S3存储桶中查找最新的CSV文件

使用boto从S3逐行读取文件?

Amazon AWS Cognito和Python Boto3建立AWS连接并将文件上传到Bucket

使用boto3和回调跟踪S3文件的下载进度

使用boto3 python计算s3中csv文件的行

使用python和boto3将s3中的文件公开

Python AWS Boto3:如何从S3存储桶读取文件?

Boto3未将zip文件上传到S3 python

上传Amazon S3 python,boto3后获取文件url

在lambda中使用boto3从s3读取和写入excel文件

如何使用Boto3从Amazon S3读取大型JSON文件

使用boto3和权证在Amazon Cognito中进行DEVICE_PASSWORD_VERIFIER质询

如何使用python(boto3)连接到带有pem文件的Amazon S3存储桶

解压缩.zip文件并使用python和boto 3传输到s3存储桶

如何使用lambda函数和boto3从s3存储桶读取csv文件?

如何使用boto3从Amazon S3获取.stl文件?

使用boto3和python从S3存储桶目录中仅读取特定格式的文件

使用Ajax和Boto3 for Django将文件上传到S3

使用python boto3使用s3和cloudfront部署静态站点

如何使用python和boto3将Amazon S3文件下载到文件夹中的本地机器上?

使用 boto3 上传文件到 S3

使用 Python 和 Boto3 从 S3 读取多个 CSV 文件

使用 Boto3 对 Amazon S3 运行查询

使用 boto3 和 python 列出 s3 存儲桶

使用 Boto3 和 Python 将 tar.gz 文件上传到 S3 存储桶