![](/img/trans.png)
[英]Create new csv file in Google Cloud Storage from cloud function
[英]How to access csv file from Google Cloud Storage in a Google Cloud Function via Pandas?
我是云功能的新手,所以我遵循了默认的 GCP 云 function “hello world”教程。 它工作正常并按预期打印“hello world”。 我只更改了 requirements.txt 文件以包含 pandas 和 google-cloud-storage。 同样,我对 main.py 脚本的所有编辑都在 function 定义之前的导入部分和 function 的 else 部分中。
要求.txt
pandas
google-cloud-storage
主要.py:
import pandas as pd
from google.cloud import storage
def hello_world(request):
"""Responds to any HTTP request.
Args:
request (flask.Request): HTTP request object.
Returns:
The response text or any set of values that can be turned into a
Response object using
`make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`.
"""
request_json = request.get_json()
if request.args and 'message' in request.args:
return request.args.get('message')
elif request_json and 'message' in request_json:
return request_json['message']
else:
storage_client = storage.Client()
bucket = storage_client.bucket('my_bucket')
model_filename = "my_file.csv"
blob = bucket.blob(model_filename)
blob.download_to_filename('temp.csv')
with open('temp.csv','rb') as f:
df = pd.read_csv(f)
return str(df.columns)
当我在 GCP 的“测试云功能”区域测试 function 时,在日志中捕获了以下错误。 前 7 行似乎是样板错误,而后两行特定于我的实际程序。 File "/layers/google.python.pip/pip/lib/python3.8/site-packages/google/cloud/storage/blob.py", line 1183, in download_to_filename with open(filename, "wb") as file_obj: OSError: [Errno 30] Read-only file system: 'temp.csv'
。 我不知道为什么会触发此错误。
错误:
Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app response = self.full_dispatch_request()
File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request rv = self.handle_user_exception(e)
File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception reraise(exc_type, exc_value, tb)
File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise raise value
File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request rv = self.dispatch_request()
File "/layers/google.python.pip/pip/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args)
File "/layers/google.python.pip/pip/lib/python3.8/site-packages/functions_framework/__init__.py", line 87, in view_func return function(request._get_current_object())
File "/workspace/main.py", line 25, in hello_world blob.download_to_filename('temp.csv')
File "/layers/google.python.pip/pip/lib/python3.8/site-packages/google/cloud/storage/blob.py", line 1183, in download_to_filename with open(filename, "wb") as file_obj: OSError: [Errno 30] Read-only file system: 'temp.csv'
对于上下文,我已经将凭据添加到适当的服务帐户,此云 function 根据我设置的配置使用该凭据。 所以,除了授权,我不知道为什么 function 会失败。 我应该改变什么?
对于上下文,我只是尝试从 pandas 的云存储中打开任意 csv 文件,并将列的名称作为字符串返回。 这没有实际价值,只是在构建有价值的东西之前进行功能测试。
Edit1:据我所知,赋予与云 function 对应的服务帐户的特定 IAM 角色是“角色/编辑器”,这应该足够了。
Edit2:GCP 云功能似乎在只读环境中运行。 所以必须有其他方法来打开文件,而不使用blob.download_to_filename
命令。
您是 Cloud Functions 的新手,需要了解一些知识并避免一些陷阱。 其中之一:Cloud Functions 是无状态的,你不能在文件系统上写。
除了/tmp
目录。 它是 memory 文件系统中的一个(正确调整您的 Cloud Functions memory 大小以考虑您的应用程序 memory 占用空间 + 存储在 /tmp 目录中的文件大小)
像这样更新您的云 Function
....
else:
storage_client = storage.Client()
bucket = storage_client.bucket('my_bucket')
model_filename = "my_file.csv"
blob = bucket.blob(model_filename)
blob.download_to_filename('/tmp/temp.csv')
with open('/tmp/temp.csv','rb') as f:
df = pd.read_csv(f)
return str(df.columns)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.