Python GCS 如何重命名内部 zip 文件中的文件?

Python GCS how to rename file within inner zip file?

假设我在 Python AppEngine 项目的 GCS 上托管了一个文件。不幸的是,这个文件结构是这样的:

outer.zip/
  - inner.zip/
    - vid_file
    - png_file

问题是 inner.zip 中的两个文件没有文件的 .mp4 扩展名,这导致了各种麻烦。我如何重命名文件,使其看起来像:

outer.zip/
  - inner.zip/
    - vid_file.mp4
    - png_file.png

以便 inner.zip 中的文件具有扩展名?

我将 运行 置于各种限制之中,因为 gcs 不允许文件重命名、取消存档...等等

文件不是很大。

P.S。我对 Python 不是很熟悉,所以任何代码示例将不胜感激,谢谢!

绝对没有 方法可以对 GCS 对象执行 任何 更改 -- 句号。它们正是您在其诞生时决定的字节串(GCS 本身未解释),因此它们将保留。

您能做的最好的事情就是创建一个 new 对象,它几乎与原始对象一样,只是它修复了您在创建原始对象时所做的一些小错误和错误。然后你可以用新的、改进的版本覆盖(即完全替换)原来的版本。

希望这是一个一次性的可怕错误,您只犯过一次,现在想改正,因此不值得为此编写程序。只需下载该 GCS 对象,使用普通工具解压缩它并解压缩它可能包含的任何其他 zip 文件,使用您最喜欢的本地文件系统工具对文件系统进行修复,再次压缩,upload/rewrite 最终压缩到您想要的新的 GCS 对象 -- 哇,大功告成。

Alex 说得对,对象是不可变的,即不能就地编辑。完成你所说的唯一方法是下载当前文件,解压缩,更新新文件,将文件重新压缩到同名文件中,然后上传到 GCS。 GCS 对象覆盖是事务性的,因此在上传完成之前,旧内容将一直可见。这样做显然不是很有效的网络,但至少它不会留下对象不可见的时间段(就像删除和重新上传一样)。

"Import zipfile" 文件下载到 gcs 存储后,您可以解压缩文件。 我有代码每晚从 cron 作业中执行此操作。 我从未尝试过使用 GAE 创建 zip 文件,但文档说你可以做到。 https://docs.python.org/2/library/zipfile.html