【问题标题】:unzip file without creating temporary files解压缩文件而不创建临时文件
【发布时间】:2021-12-05 20:37:59
【问题描述】:

我从 AWS S3 下载了一个 zip 文件并将其解压缩。解压后,所有文件都保存在tmp/文件夹中。

s3 = boto3.client('s3')

s3.download_file('testunzipping','DataPump_10000838.zip','/tmp/DataPump_10000838.zip')

with zipfile.ZipFile('/tmp/DataPump_10000838.zip', 'r') as zip_ref:
    zip_ref.extractall('/tmp/')
    lstNEW = zip_ref.namelist()

listNEW 的输出是这样的:

['DataPump_10000838/', '__MACOSX/._DataPump_10000838', 'DataPump_10000838/DockBooking', '__MACOSX/DataPump_10000838/._DockBooking', 'DataPump_10000838/LoadEquipment', '__MACOSX/DataPump_10000838/._LoadEquipment', ....]

LoadEquipment 和 DockBooking 是文件,但其余的不是。是否可以在不创建这些临时文件的情况下解压缩文件?或者我可以过滤掉真实文件吗?因为以后,我需要使用正确的文件并gzip它们。

$item_$unixepochtimestamp.csv.gz

我是否使用压缩功能?

【问题讨论】:

  • 我不确定您的问题是什么,或者您在解压缩后如何使用这些文件。但是...也许您只是想解压缩到内存(而不是写入 /tmp):stackoverflow.com/a/10909016/421195。无论如何,听起来你绝对不想要“extractall()”。在这里寻找替代品:docs.python.org/3/library/zipfile.html
  • 解压缩后,我想将它们转换为 gzip 并存储在另一个 s3 存储桶中。我怎样才能通过阅读实现这一目标?我的意思是如何在不下载/提取它们的情况下压缩所有解压缩的文件? @paulsm4 另外,我正在写信给这个答案的 /tmp bc stackoverflow.com/a/69586599/12304000

标签: python zip gzip unzip tmp


【解决方案1】:

要仅提取某些文件,您可以将列表传递给extractall

with zipfile.ZipFile('/tmp/DataPump_10000838.zip', 'r') as zip_ref:
    lstNEW = list(filter(lambda x: not x.startswith("__MACOSX/"), zip_ref.namelist()))
    zip_ref.extractall('/tmp/', members=lstNEW)

这些文件不是临时文件,而是 macOS 在通常不支持的 zip 文件中表示资源分支的方式。

【讨论】:

  • 如果我在 AWS 上的某个自动管道中运行 lambda 函数,这仍然有效吗?我的意思是它会一直是 macOS 吗?
  • 显然这是一个非标准的 macOS 约定,Apple 可以随时更改它,但到目前为止,它们始终以特殊名称 __MACOSX 表示资源分叉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 2021-03-07
  • 2021-03-24
  • 2020-05-24
  • 1970-01-01
  • 2015-05-04
  • 2010-09-05
相关资源
最近更新 更多