必要に迫られてプログラムを書いた。いつも通りRuntimeはPython3.7。
import os
import csv
from io import StringIO
from google.cloud import storage
# 環境変数を参照
BUCKET_NAME = os.environ.get('BUCKET_NAME')
"""
Storageへのアップロード処理
"""
def upload_blob(bucket_name, source_file_name, destination_blob_name):
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob(destination_blob_name)
blob.upload_from_string(data=source_file_name, content_type='text/csv')
# トリガーをpub/subに設定
def main(event, context)
# csvファイルに反映する内容
list = [[1,2,3], [4,5,6], [7,8,9]]
si = StringIO()
cw = csv.writer(si, quoting=csv.QUOTE_ALL)# csvの値にダブルクオートを付与。
cw.writerows(items_info)
upload_blob(BUCKET_NAME, si.getvalue(), 'hoge.csv')
Pythonのio.StringIO
このモジュールを使うことでCSVファイルに使用する文字列をメモリ上に乗せることが出来る。
Cloud Functionsではいわゆるローカル環境でCSVファイルを作成するようなことでは無く、メモリ上の文字列を最終出力としてCSVファイルを生成することになる。
基本的にはバッファに文字列を読み込んだり書き込んだりすることができる。
import io
output = io.StringIO()
output.write(u'aaaaaaaaaaa')
output.write(u'bbbbbbbbbbb')
# 読み込んだ文字列を出力
print(output.getvalue())
# => aaaaaaaaaaabbbbbbbbbbb
# バッファクローズ
output.close()
input = io.StringIO(u'ccccccc')
print(input.getvalue())
# => ccccccc
# 書き込み
input.write(u'ddddddddddd')
print(input.getvalue())
# => ddddddddddd