Не удается загрузить файлы из облачного хранилища Google: Ошибка значения(«%r не удалось преобразовать в юникод» % (значение,))

# #python #google-cloud-platform #google-cloud-storage

Вопрос:

Я пытаюсь загрузить файл из своего облачного хранилища с помощью Python:

 GCP_BUCKET_NAME = "my-learning-bucket"
storage_bucket = storage_client.bucket(GCP_BUCKET_NAME)


def download_object(download_obj_name):
    blob = storage_bucket.blob(download_obj_name)
    blob.download_to_file_name(f"downloads/data.db")
 

Но это дает мне ошибку:

 Traceback (most recent call last):
  File "/Users/asnimansari/Desktop/tradestation/ares/main.py", line 22, in <module>
    root.run_click_commands()
  File "/Users/asnimansari/.pyenv/versions/3.9.4/lib/python3.9/site-packages/click/core.py", line 1137, in __call__
    return self.main(*args, **kwargs)
  File "/Users/asnimansari/.pyenv/versions/3.9.4/lib/python3.9/site-packages/click/core.py", line 1062, in main
    rv = self.invoke(ctx)
  File "/Users/asnimansari/.pyenv/versions/3.9.4/lib/python3.9/site-packages/click/core.py", line 1668, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/asnimansari/.pyenv/versions/3.9.4/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/asnimansari/.pyenv/versions/3.9.4/lib/python3.9/site-packages/click/core.py", line 763, in invoke
    return __callback(*args, **kwargs)
  File "/Users/asnimansari/Desktop/tradestation/ares/commands/import_data.py", line 9, in import_data
    import_latest_data_from_gc()
  File "/Users/asnimansari/Desktop/tradestation/ares/helpers/import_data_from_gc.py", line 8, in import_latest_data_from_gc
    db_names_in_gcp = get_db_names_in_gcp()
  File "/Users/asnimansari/Desktop/tradestation/ares/helpers/gcp.py", line 29, in get_db_names_in_gcp
    donwload_object(bobu)
  File "/Users/asnimansari/Desktop/tradestation/ares/helpers/gcp.py", line 13, in donwload_object
    blob = storage_bucket.blob(download_obj_name)
  File "/Users/asnimansari/.pyenv/versions/3.9.4/lib/python3.9/site-packages/google/cloud/storage/bucket.py", line 688, in blob
    return Blob(
  File "/Users/asnimansari/.pyenv/versions/3.9.4/lib/python3.9/site-packages/google/cloud/storage/blob.py", line 205, in __init__
    name = _bytes_to_unicode(name)
  File "/Users/asnimansari/.pyenv/versions/3.9.4/lib/python3.9/site-packages/google/cloud/_helpers.py", line 389, in _bytes_to_unicode
    raise ValueError("%r could not be converted to unicode" % (value,))
ValueError: <Blob: tradeenginedata, quotes/quotes_2021-06-10.db, 1623310593606516> could not be converted to unicode
 

Файл представляет собой базу данных sqlite.

Комментарии:

1. Можете ли вы проверить кодировку файла на облачной консоли Google? Можете ли вы загрузить файл с помощью gsutil?

2. @guillaumeblaquiere gsutils работает, я могу загружать с его помощью. кодировка файла является application/octet-stream

3. Можете ли вы поделиться своими зависимостями?

4. @guillaumeblaquiere google-cloud-storage==1.38.0 . Я также загружаю файлы из той же кодовой базы.

5. Вы пользуетесь Колбой? Это, возможно, тупик, но с помощью функции Cloud вам нужно использовать (если вам нужно ее определить) специальную версию Flask, иначе у вас возникнет конфликт с версией зависимости от клика. Я не знаю, может ли это быть слишком недавняя версия click, в которой есть ошибка, а затем она может вызвать эту проблему…

Ответ №1:

Я вижу, что вы уже открыли ссылку на проблему GitHub, и уже есть ответ от команды облачного хранилища.

Как они уже упоминали, ошибка возникает из-за того, что вы передаете недопустимую строку storage_bucket.blob() . В качестве дополнительного понимания мы можем видеть из ошибки, что на самом деле передается объект Blob, а не строка.

Поэтому, пожалуйста, убедитесь, что download_obj_name это допустимая строка, а не объект Blob.

Кроме того, вы должны исправить опечатку в методе загрузки и заметить дополнительное подчеркивание. Правильный метод download_to_filename() -нет download_to_file_name() .