не могу правильно получить доступ к объекту GCS из облачных функций - PullRequest
0 голосов
/ 11 октября 2018

Каждый раз, когда я пытаюсь получить объект корзины облачного хранилища и вводить данные, используя метод, показанный на сайтах поддержки, я получаю сообщение об ошибке

google.api_core.exceptions.InvalidArgument: 400 Указанный объект GCSв gcs_content_uri не существует.

Ссылка gcs выглядит следующим образом при печати:

gs: //lang-docs-in/b'doc1.txt'

Я перепробовал все, чтобы это заработало: кодирование, декодирование и т. Д. Часами, но безрезультатно.Есть мысли?

main.py

import sys
from google.cloud import language
from google.cloud import storage

storage_client = storage.Client()

DOCUMENT_BUCKET = 'lang-docs-out'

def process_document(data, context):
    # Get file attrs
    bucket = storage_client.get_bucket(data['bucket'])
    blob = bucket.get_blob(data['name'])
    # send to NLP API
    gcs_obj = 'gs://{}/{}'.format(bucket.name, blob.name.decode('utf-8'))
    print('LOOK HERE')
    print(gcs_obj)
    parsed_doc = analyze_document(bucket, blob)
    # Upload the resampled image to the other bucket
    bucket = storage_client.get_bucket(DOCUMENT_BUCKET)
    newblob = bucket.blob('parsed-' + data['name'])     
    newblob.upload_from_string(parsed_doc)

def analyze_document(bucket, blob):
    language_client = language.LanguageServiceClient()
    gcs_obj = 'gs://{}/{}'.format(bucket.name, blob.name.decode('utf-8'))
    print(gcs_obj)
    document = language.types.Document(gcs_content_uri=gcs_obj, language='en', type='PLAIN_TEXT')
    response = language_client.analyze_syntax(document=document, encoding_type= get_native_encoding_type())
    return response

def get_native_encoding_type():
    """Returns the encoding type that matches Python's native strings."""
    if sys.maxunicode == 65535:
        return 'UTF16'
    else:
        return 'UTF32'

needs.txt

google-cloud-storage
google-cloud-language
google-api-python-client
grpcio
grpcio-tools

1 Ответ

0 голосов
/ 15 октября 2018

Атрибут name экземпляра google.cloud.storage.blob.Blob должен быть строкой, поэтому вам вообще не нужно делать .decode().

Вероятно, выбуквально есть файл с именем "b'doc1.txt'", который был создан из-за проблем с добавлением файлов в GCS, а не с вашей облачной функцией, например:

>>> blob.name
"b'doc1.txt'"
>>> type(blob.name)
<class 'str'>

, а не:

>>> blob.name
b'doc1.txt'
>>> type(blob.name)
<class 'bytes'>

Это было бы действительно трудно различить, так как они выглядят одинаково при печати:

>>> print(b'hi')
b'hi'
>>> print("b'hi'")
b'hi'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...