GCS - считывание текстового файла из Google Cloud Storage непосредственно в python

Я чувствую себя немного глупо прямо сейчас. Я читал множество документов и вопросов о стекопереработке, но не могу понять это правильно.

У меня есть файл в Google Cloud Storage. Он находится в ведре test_bucket. Внутри этого сегмента находится папка "temp_files_folder", которая содержит два файла: один.txt файл с именем "test.txt" и один.csv файл с именем "test.csv". Эти два файла просто потому, что я пытаюсь использовать оба, но результат одинаков в любом случае.

Содержание в файлах

hej
san

и я надеюсь прочитать его в Python так же, как я сделал бы на локальном с

textfile = open("/file_path/test.txt", 'r')
times = textfile.read().splitlines()
textfile.close()
print(times)

который дает

['hej', 'san']

Я пытался использовать

from google.cloud import storage

client = storage.Client()

bucket = client.get_bucket('test_bucket')

blob = bucket.get_blob('temp_files_folder/test.txt')

print(blob.download_as_string)

но это дает выход

<bound method Blob.download_as_string of <Blob: test_bucket, temp_files_folder/test.txt>>

Как я могу получить фактические строки в файле?

5 ответов

Решение

download_as_string это метод, вам нужно вызвать его.

print(blob.download_as_string())

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

downloaded_blob = blob.download_as_string()
print(downloaded_blob)
do_something_else(downloaded_blob)

Метод 'download_as_string()'будет читать содержимое как байт.

Ниже приведен пример обработки файла.csv.

import csv
from io import StringIO

from google.cloud import storage

storage_client = storage.Client()
bucket = storage_client.get_bucket(YOUR_BUCKET_NAME)

blob = bucket.blob(YOUR_FILE_NAME)
blob = blob.download_as_string()
blob = blob.decode('utf-8')

blob = StringIO(blob)  #tranform bytes to string here

names = csv.reader(blob)  #then use csv library to read the content
for name in names:
    print(f"First Name: {name[0]}")

Согласно документации (https://googleapis.dev/python/storage/latest/blobs.html), на момент написания (2021/08) download_as_string метод является устаревшим псевдонимом для download_as_byte метод, который, как следует из названия, возвращает byte объект.

Вместо этого вы можете использовать download_as_text метод для возврата str объект.

Например, чтобы скачать файл MYFILE из ведра MYBUCKET и сохраните его как строку в кодировке utf-8:

      from google.cloud.storage import Client
client = Client()
bucket = client.get_bucket(MYBUCKET)
blob = bucket.get_blob(MYFILE)
downloaded_file = blob.download_as_text(encoding="utf-8")

Затем вы также можете использовать это для чтения файлов различных форматов. Для json замените последнюю строку на

      import json
downloaded_json_file = json.loads(blob.download_as_text(encoding="utf-8"))

Для файлов yaml замените последнюю строку на:

      import yaml
downloaded_yaml_file = yaml.safe_load(blob.download_as_text(encoding="utf-8"))

НЕ ИСПОЛЬЗУЙТЕ :

ИСПОЛЬЗОВАНИЕ :


blob.download_as_text()действительно возвращает строку.

blob.download_as_string()устарел и возвращает объект байтов вместо строкового объекта.

Работает при чтении docx / текстового файла

    from google.cloud import storage
    # create storage client
    storage_client = storage.Client.from_service_account_json('**PATH OF JSON FILE**')
    bucket = storage_client.get_bucket('**BUCKET NAME**')
    # get bucket data as blob
    blob = bucket.blob('**SPECIFYING THE DOXC FILENAME**')
    downloaded_blob = blob.download_as_string()
    downloaded_blob = downloaded_blob.decode("utf-8") 
    print(downloaded_blob)
Другие вопросы по тегам