Как передать через ZIP и иметь полезное имя файла внутри архива - PullRequest
0 голосов
/ 16 мая 2019

Я ищу способ сжать (большой) файл, сохраненный в 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 Ответ

2 голосов
/ 18 мая 2019

Благодаря совету 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))

... дает желаемый результат.

...