【问题标题】:Deleting original files as you go along adding files to a TAR file在将文件添加到 TAR 文件时删除原始文件
【发布时间】:2018-06-25 19:37:49
【问题描述】:

我写了一个小服务器函数,目的是把tar一堆本地下载的文件放在一起,然后删除原件。它看起来像这样:

with tarfile.open(archive_filename, "w:gz") as tar:
    for pb in designated_objects:
        bucket.download_file(pb.key, pb.key)
        tar.add(pb.key)
        os.delete(pb.key)

我的期望是这将生成一个包含所有我想要的数据和一个空目录的 tar 文件。这里的想法是我想尽可能减少我的磁盘使用量。但是,我不确定是否允许在 tarfile 生成完成之前删除文件(如此处所做的)。

这个表达式会按预期工作吗?

如果不会,是否有类似于附加模式的东西?

【问题讨论】:

  • 似乎最简单的找出方法就是尝试一下
  • 这适用于 AWS s3 存储桶吗?您是否考虑过改用download_fileobj?这样您就不必费心将重复的数据放在磁盘上,稍后再将其删除。
  • @sytech 这确实是 AWS S3 操作。我很佩服你已经抓住了它!这是一个我正在尝试优化内存使用的 Lambda 函数。
  • @dave 我试过了。请参阅下面的答案。
  • @AlekseyBilogur 然后使用download_fileobj 听起来像是要走的路。因为tarfile.open 接受类似文件的对象,所以您应该能够将文件直接下载到您的存档中,而无需将其放在磁盘上。

标签: python-3.x tar


【解决方案1】:

正如预期的那样,原始文件被填充,然后被删除。但是,存档的行为是不寻常的。运行此代码块时,会生成 no 存档。事实上,这个代码块什么都不做(除了删除你的文件)。

考虑到在with 语句中使用pass(如下面的代码)实际上会将一个空存档写入磁盘,我发现这种行为特别不寻常且令人惊讶。所以从某种意义上说,给定的代码块几乎没有

with tarfile.open('archive_filename.xy.gz', "w:gz") as tar:
   pass

作为参考,我在 Python 3.6 中得到了这种行为。与其他 Python 版本的行为可能不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多