Чтение CSV из хранилища Google с помощью функций Google в скрипте Python - PullRequest
0 голосов
/ 11 ноября 2019

Я новичок в GCP и пытаюсь создать простой API с функциями Google, этот API должен прочитать CSV из корзины Google Storage и вернуть json. Для этого в моем локальном я могу нормально запустить, открыть файл.

Но в функциях Google я получил большой двоичный объект из корзины, и я не знаю, как с этим справиться, я получаю сообщение об ошибке

Я пытаюсь преобразовать большой двоичный объект в байты и в строку, но точно не знаюкак это сделать

Код работает в моем локальном env


data1 = '2019-08-20'
data1 = datetime.datetime.strptime(data1, '%Y-%m-%d')

data2 = '2019-11-21' 
data2 = datetime.datetime.strptime(data2, '%Y-%m-%d')


with open("/home/thiago/mycsvexample.csv", "r") as fin:
    #create a CSV dictionary reader object
    print(type(fin))
    csv_dreader = csv.DictReader(fin)
#iterate over all rows in CSV dict reader
    for row in csv_dreader:
        #check for invalid Date values

        #convert date string to a date object
        date = datetime.datetime.strptime(row['date'], '%Y-%m-%d')
        #check if date falls within requested range
        if date >= data1 and date <= data2:
            total = total + float(row['total'])

print(total)

Код в Google Функции:

import csv, datetime
from google.cloud import storage
from io import BytesIO 

def get_orders(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 'token' in request.args:
        if request.args['token'] == 'mytoken888888':
            client = storage.Client()
            bucket = client.get_bucket('mybucketgoogle.appspot.com')

            blob = bucket.get_blob('mycsvfile.csv')
            byte_stream = BytesIO()
            blob.download_to_file(byte_stream)
            byte_stream.seek(0)
            file = byte_stream

            #with open(BytesIO(blob), "r") as fin:

                #create a CSV dictionary reader object
            csv_dreader = csv.DictReader(file)
                #iterate over all rows in CSV dict reader
            for row in csv_dreader:
                #check for invalid Date values


                date = datetime.datetime.strptime(row['date'], '%Y-%m-%d')
                    #check if date falls within requested range
                if date >= datetime.datetime.strptime(request.args['start_date']) and date <= datetime.datetime.strptime(request.args['end_date']):
                    total = total + float(row['total'])
            dict = {'total_faturado' : total}



            return dict
        else:

            return f'Passe parametros corretos'
    else:
        return f'Passe parametros corretos'

Ошибка в облачных функциях Google

Traceback (most recent call last): File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 346, in run_http_function result = _function_handler.invoke_user_function(flask.request) File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 217, in invoke_user_function return call_user_function(request_or_event) File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 210, in call_user_function return self._user_function(request_or_event) File "/user_code/main.py", line 31, in get_orders_tramontina for row in csv_dreader: File "/opt/python3.7/lib/python3.7/csv.py", line 111, in __next__ self.fieldnames File "/opt/python3.7/lib/python3.7/csv.py", line 98, in fieldnames self._fieldnames = next(self.reader) _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Я пытаюсь сделать что-то другое, но безуспешно ...

Кто-то может помочь мне с этим блобом, преобразовать это или манипулировать правильным способом?

Спасибо всем

1 Ответ

0 голосов
/ 11 ноября 2019

Попробуйте загрузить файл в виде строки, чтобы вы могли проверить наличие недопустимых значений данных и в конечном итоге записать это в файл.

изменить blob.download_to_file(byte_stream) на my_blob_str = blob.download_as_string()

Я думаю, что ваша настоящая проблема byte_stream = BytesIO(), так как ваш вывод читает iterator should return strings, not bytes (did you open the file in text mode?)

Он ожидает строку, но получаетбайт. Какова цель byte_stream? Если случайно, просто удалите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...