Написать 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