我正在寻找一种方法来压缩存储在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中得到一个可用的名称-但该命令花费的时间非常长,并且需要相应的大(虚拟)硬盘。
答案 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))
...给出了预期的结果。