Написать CSV в облачное хранилище Google

Я пытаюсь понять, как записать многострочный CSV-файл в облачное хранилище Google. Я просто не следую документации

Закрыть здесь: Невозможно прочитать CSV-файл, загруженный в корзину облачного хранилища Google.

Пример:

from google.cloud import storage
from oauth2client.client import GoogleCredentials
import os

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "<pathtomycredentials>"

a=[1,2,3]

b=['a','b','c']

storage_client = storage.Client()
bucket = storage_client.get_bucket("<mybucketname>")

blob=bucket.blob("Hummingbirds/trainingdata.csv")

for eachrow in range(3):
    blob.upload_from_string(str(a[eachrow]) + "," + str(b[eachrow]))

Это дает вам одну строчку в облачном хранилище Google

3,c

ясно, что каждый раз открывал новый файл и записывал строку.

Хорошо, а как насчет добавления новой строки разделителя?

for eachrow in range(3):
    blob.upload_from_string(str(a[eachrow]) + "," + str(b[eachrow]) + "\n")

это добавляет разрыв строки, но снова пишет с начала.

Может кто-нибудь проиллюстрировать, что такое подход? Я мог бы объединить все свои строки в одну строку или записать временный файл, но это кажется очень уродливым.

Возможно, с открытым как файл?

4 ответа

Решение

blob.upload_from_string(data) Метод создает новый объект, содержимое которого точно соответствует содержимому строки data, Он перезаписывает существующие объекты, а не добавляется.

Самое простое решение - записать весь CSV во временный файл, а затем загрузить этот файл в GCS с помощью blob.upload_from_filename(filename) функция.

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

import pandas as pd
 data = [['Alex','Feb',10],['Bob','jan',12]]
 df = pd.DataFrame(data,columns=['Name','Month','Age'])
 print df

Выход

   Name Month  Age
0  Alex   Feb   10
1   Bob   jan   12

Добавить строку

row = ['Sally','Oct',15]
df.loc[len(df)] = row
print df

выход

     Name Month  Age
 0   Alex   Feb   10
 1    Bob   jan   12
 2  Sally   Oct   15

запись / копирование в GCP Bucket с использованием gsutil

  df.to_csv('text.csv', index = False)
 !gsutil cp 'text.csv' 'gs://BucketName/folderName/'
      from google.cloud import storage
from oauth2client.client import GoogleCredentials
import os

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "<pathtomycredentials>"

a=[1,2,3]

b=['a','b','c']

storage_client = storage.Client()
bucket = storage_client.get_bucket("<mybucketname>")

blob=bucket.blob("Hummingbirds/trainingdata.csv")

# build up the complete csv string
csv_string_to_upload = ''

for eachrow in range(3):
    # add the lines
    csv_string_to_upload = csv_string_to_upload + str(a[eachrow]) + ',' + b[eachrow] + '\n'

# upload the complete csv string
blob.upload_from_string(
            data=csv_string_to_upload,
            content_type='text/csv'
        )

Просто наткнулся на этот пост после того, как столкнулся с точно такой же проблемой. После долгих мучений я обнаружил, что лучшим решением для меня является загрузка файла .csv в виде байтов. Вот как я это сделал:

      new_csv_filename = csv_path + "report_" + start_date_str + "-" + end_date_str + 
".csv"
df.to_csv(new_csv_filename, index=False)
# upload the file to the storage
blob = bucket.blob(new_csv_filename)
with open(new_csv_filename, 'rb') as f:  # here we open the file with read bytes option
    blob.upload_from_file(f)   # upload from file is now uploading the file as bytes
blob.make_public()
# generate a download url and return it
return blob.public_url 
Другие вопросы по тегам