web-dev-qa-db-ja.com

Googleクラウドストレージで.Zipファイルを解凍するにはどうすればよいですか?

Google Cloud Storage Bucketで.Zipファイルを解凍するにはどうすればよいですか? (AWS用の「CloudBerry Explorer」のような他のツールがあれば、それは素晴らしいことです。)

9
Naaga A

Firebase Cloud Functionとして実行するために作成したコードを次に示します。コンテンツタイプ「application/Zip」でバケットにロードされたファイルをリッスンし、それらを所定の場所に抽出するように設計されています。

const functions = require('firebase-functions');
const admin = require("firebase-admin");
const path = require('path');
const fs = require('fs');
const os = require('os');
const unzip = require('unzipper')

admin.initializeApp();

const storage = admin.storage();


const runtimeOpts = {
  timeoutSeconds: 540,
  memory: '2GB'
}

exports.unzip = functions.runWith(runtimeOpts).storage.object().onFinalize((object) => {

    return new Promise((resolve, reject) => {
        //console.log(object)
        if (object.contentType !== 'application/Zip') {
          reject();
        } else {
          const bucket = firebase.storage.bucket(object.bucket)
          const remoteFile = bucket.file(object.name)
          const remoteDir = object.name.replace('.Zip', '')

          console.log(`Downloading ${remoteFile}`)

          remoteFile.createReadStream()
            .on('error', err => {
              console.error(err)
              reject(err);
            })
            .on('response', response => {
              // Server connected and responded with the specified status and headers.
              //console.log(response)
            })
            .on('end', () => {
              // The file is fully downloaded.
              console.log("Finished downloading.")
              resolve();
            })
            .pipe(unzip.Parse())
            .on('entry', entry => {
              const file = bucket.file(`${remoteDir}/${entry.path}`)

              entry.pipe(file.createWriteStream())
              .on('error', err => {
                console.log(err)
                reject(err);
              })
              .on('finish', () => {
                console.log(`Finsihed extracting ${remoteDir}/${entry.path}`)
              });

              entry.autodrain();

            });
        }
    })

});
8
Aeyrium

Pythonを使用できます。クラウド機能から:

from google.cloud import storage
from zipfile import ZipFile
from zipfile import is_zipfile
import io

def zipextract(bucketname, zipfilename_with_path):

    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucketname)

    destination_blob_pathname = zipfilename_with_path

    blob = bucket.blob(destination_blob_pathname)
    zipbytes = io.BytesIO(blob.download_as_string())

    if is_zipfile(zipbytes):
        with ZipFile(zipbytes, 'r') as myzip:
            for contentfilename in myzip.namelist():
                contentfile = myzip.read(contentfilename)
                blob = bucket.blob(zipfilename_with_path + "/" + contentfilename)
                blob.upload_from_string(contentfile)

zipextract("mybucket", "path/file.Zip") # if the file is gs://mybucket/path/file.Zip
8
Daniel Sparing

幸いなことに、GCSにはファイルを解凍するメカニズムはありません。同じことに関する 機能のリクエスト は、既にGoogle開発チームに転送されています。

別の方法として、GCSバケットにZipファイルをアップロードしてから、VMインスタンスに接続された永続ディスクにダウンロードし、そこに解凍し、解凍したファイルを-を使用してアップロードできます。 gsutilツール

6
D Saini

デフォルトでは、Goolge Cloudにはこれを実行できるプログラムはありませんが、たとえば-を使用してこの機能を使用できますPython.

Pythonが(Google Cloud上でも)であるすべてのマシンで利用可能なユニバーサルメソッド:

次のコマンドを入力するだけです。

python

または、管理者権限が必要な場合:

Sudo python

そしてPythonインタープリター

>>> from zipfile import ZipFile
>>> Zip_file = ZipFile('path_to_file/t.Zip', 'r')
>>> Zip_file.extractall('path_to_extract_folder')

そして最後に、プレス Ctrl+D Pythonインタープリターを終了します。

展開されたファイルは、指定した場所に配置されます(もちろん、これらの場所に適切なアクセス許可がある場合)。

上記の方法Python 2およびPython 3

最大限に楽しんでください! :)

2
simhumileco

シェルでは、以下のコマンドを使用して圧縮ファイルを解凍できます

gsutil cat gs://bucket/obj.csv.gz | zcat |  gsutil cp - gs://bucket/obj.csv
1
Dishant Mishra

クラウドストレージのファイルをZip/unzipするのに役立つデータフローテンプレートがgoogleクラウドデータフローにあります。 スクリーンショットを参照

このテンプレートは、Cloud Storage上のファイルを指定された場所に解凍するバッチパイプラインをステージングします。この機能は、圧縮データを使用してネットワーク帯域幅コストを最小限に抑える場合に役立ちます。パイプラインは、1回の実行中に複数の圧縮モードを自動的に処理し、ファイル拡張子(.bzip2、.deflate、.gz、.Zip)に基づいて使用する解凍モードを決定します。

パイプラインの要件

解凍するファイルは、Bzip2、Deflate、Gzip、Zipのいずれかの形式である必要があります。

出力ディレクトリは、パイプラインの実行前に存在する必要があります。

0
Vali7394

別の高速な方法Pythonバージョンでは3.2以上

import shutil
shutil.unpack_archive('filename')

このメソッドでは、宛先フォルダーを指定することもできます。

shutil.unpack_archive('filename', 'extract_dir')

上記の方法は、Zipアーカイブだけでなく、tarでも機能します、gztarbztar、またはxztarアーカイブ。

さらにオプションが必要な場合は、shutilモジュールのドキュメントを参照してください。 shutil.unpack_archive

0
simhumileco