讀取及寫入 Google Cloud Storage

本文件說明如何透過 Cloud Storage 適用的 App Engine 用戶端程式庫,在 App Engine 應用程式中使用 Cloud Storage 來儲存和擷取資料。本文假設您已依設定 Google Cloud Storage 一文的指示啟用 Cloud Storage 值區及下載用戶端程式庫,同時假設您知道如何依 Python 2 App Engine 標準環境的快速入門導覽課程的指示建構 App Engine 應用程式。

必要匯入項目

main.py 檔案包含透過用戶端程式庫存取 Cloud Storage 時使用的一般匯入項目:

import logging
import os
import cloudstorage as gcs
import webapp2

from google.appengine.api import app_identity

您需要 os 模組和 app_identity API,以在執行階段取得預設值區名稱。請注意,如果您不使用預設值區,就得透過其他方法提供值區名稱。

指定 Cloud Storage 值區

在 Cloud Storage 中執行任何作業前,您需要先提供值區名稱。最簡單的方法是使用專案的預設值區,取得方式如下:

def get(self):
  bucket_name = os.environ.get('BUCKET_NAME',
                               app_identity.get_default_gcs_bucket_name())

  self.response.headers['Content-Type'] = 'text/plain'
  self.response.write('Demo GCS Application running from Version: '
                      + os.environ['CURRENT_VERSION_ID'] + '\n')
  self.response.write('Using bucket name: ' + bucket_name + '\n\n')

您必須先為專案建立預設值區,對 get_default_gcs_bucket_name 發出的呼叫才會成功。

寫入 Cloud Storage

以下是如何寫入值區的範例:

def create_file(self, filename):
  """Create a file.

  The retry_params specified in the open call will override the default
  retry params for this particular file handle.

  Args:
    filename: filename.
  """
  self.response.write('Creating file %s\n' % filename)

  write_retry_params = gcs.RetryParams(backoff_factor=1.1)
  gcs_file = gcs.open(filename,
                      'w',
                      content_type='text/plain',
                      options={'x-goog-meta-foo': 'foo',
                               'x-goog-meta-bar': 'bar'},
                      retry_params=write_retry_params)
  gcs_file.write('abcde\n')
  gcs_file.write('f'*1024*4 + '\n')
  gcs_file.close()
  self.tmp_filenames_to_clean_up.append(filename)

請注意,呼叫 open 以開啟檔案進行寫入時,程式碼範例會指定特定 Cloud Storage 標頭,針對檔案寫入自訂中繼資料;這些中繼資料可使用 cloudstorage.stat 擷取。您可以在 cloudstorage.open 參考資料中找到受支援標頭的清單。

此外,這個範例並未設定 x-goog-acl。這表示公開讀取權限的預設 Cloud Storage ACL 將在寫入至值區時套用至物件。

最後,在完成寫入時需要呼叫 close 關閉檔案。如果沒有執行此操作,檔案就不會寫入至 Cloud Storage。請注意,在呼叫 close 後,就無法在檔案中附加任何內容。如需修改檔案,您必須在寫入模式中再次開啟檔案,但這會進行覆寫作業而非附加作業。

從 Cloud Storage 讀取

以下是如何讀取值區中檔案的範例:

def read_file(self, filename):
  self.response.write('Reading the full file contents:\n')

  gcs_file = gcs.open(filename)
  contents = gcs_file.read()
  gcs_file.close()
  self.response.write(contents)

filename 引數YOUR_BUCKET_NAME/PATH_IN_GCS 格式指定。這個範例說明如何使用 seek 來顯示讀取中檔案裡的所選行 (在此範例中為第一行和最後一千行)。

請注意,上述程式碼並未指定要使用哪種模式開啟檔案以進行讀取。open 預設為唯讀模式。

列出值區內容

以下範例程式碼說明如何使用 marker 逐頁瀏覽含有大量檔案的值區,並使用 max_keys 參數逐頁瀏覽值區內容的清單:

def list_bucket(self, bucket):
  """Create several files and paginate through them.

  Production apps should set page_size to a practical value.

  Args:
    bucket: bucket.
  """
  self.response.write('Listbucket result:\n')

  page_size = 1
  stats = gcs.listbucket(bucket + '/foo', max_keys=page_size)
  while True:
    count = 0
    for stat in stats:
      count += 1
      self.response.write(repr(stat))
      self.response.write('\n')

    if count != page_size or count == 0:
      break
    stats = gcs.listbucket(bucket + '/foo', max_keys=page_size,
                           marker=stat.filename)

請注意,完整的檔案名稱會顯示為單一字串,不會有目錄分隔字元。如要在顯示檔案時一併顯示其更易於辨識的目錄階層,請將 delimiter 參數設為您要使用的目錄分隔字元。

刪除 Cloud Storage 中的檔案

以下程式碼示範的是如何使用 cloudstorage.delete() 方法 (以 gcs 形式匯入) 刪除 Cloud Storage 中的檔案。

def delete_files(self):
  self.response.write('Deleting files...\n')
  for filename in self.tmp_filenames_to_clean_up:
    self.response.write('Deleting file %s\n' % filename)
    try:
      gcs.delete(filename)
    except gcs.NotFoundError:
      pass

這個範例會清除在寫入 Cloud Storage 一節中寫入至值區的檔案。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境