如何通过ZIP传输文件并在存档中使用可用的文件名

时间:2019-05-16 16:39:43

标签: linux python-3.x zip google-cloud-storage pipeline

我正在寻找一种方法来压缩存储在google-bucket中的(大)文件,并将压缩后的文件也写入google-bucket。

此命令序列可以快速,正常地工作:

gsutil cat gs://bucket/20190515.csv | zip | gsutil cp - gs://bucket/20190515.csv.zip

...但是存在ZIP文件名中无用的名称“-”的问题。

另一方面,如果我使用以下顺序:

gsutil cp gs://bucket/20190515.csv .
zip -m 20190515.csv.zip 20190515.csv
gsutil mv 20190515.csv.zip gs://bucket/20190515.csv.zip

...然后我在ZIP中得到一个可用的名称-但该命令花费的时间非常长,并且需要相应的大(虚拟)硬盘。

1 个答案:

答案 0 :(得分:2)

由于meuh的建议,我现在有一个解决方案:

#!/usr/bin/python3
import sys, zipstream
with zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) as z:
    z.write_iter(sys.argv[1], sys.stdin.buffer)
    for chunk in z:
        sys.stdout.buffer.write(chunk)

..存储为 streamzip.py 。 然后进行以下调用:

fn="bucket/20190515.csv"
execCmd("gsutil cat gs://%s | streamzip.py %s | gsutil cp - gs://%s.zip"%(fn, fn.split("/")[-1], fn))

...给出了预期的结果。