В недавнем проекте мне нужно было поделиться результатами, полученными из некоторого анализа данных с Панды В формате CSV в Google Sheets. Первым подходом, который я попробовал, был использование Gsheets Что довольно приятно, но у него есть недостатки:
- Его аутентификация опирается на oauth2client который был устарел.
- Это
import_csv
Метод всегда заменяет всю электронную таблицу, и мне нужно было иметь несколько внутренних листов, которые учитывали разные переменные одинаковых данных.
Итак, я решил придумать свое решение. Перво -наперво, вам нужно настроить новый проект на Google Cloud Console И создайте учетные данные, убедитесь, что они имеют учетную запись Service Type, которая позволит сервер к серверу. После создания учетных данных скачать как Json
и переместить его в папку проекта.
Затем перейдите в консоль Библиотека API И включите как API листов, так и API Drive, позже необходимо поделиться созданием электронной таблицы.
Находясь в папке проектов, мы добавим следующие зависимости в наш файл требований:
google-api-python-client google-auth pandas numpy
И установите их запуск:
$ pip install -r requirements.txt
Теперь, когда наша установка готова, мы можем аутентифицировать наш проект с помощью следующего кода:
credentials = service_account.Credentials.from_service_account_file( "./path/to/credentials.json" ) scopes = credentials.with_scopes( [ "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive", ] )
URL -адреса для областей можно найти Здесь Анкет
Первое, что нам нужно, – это способ создать электронную таблицу из DataFrames Pandas, поэтому мы можем определить функцию, которая получает два параметра, заголовок электронной таблицы и список DataFrames:
def create_sheet(title, data): sheets_service = build("sheets", "v4", credentials=credentials) sheets = sheets_service.spreadsheets() # Body of create method with a Spreadsheet(https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#Spreadsheet) instance create_body = {"properties": {"title": f"{title} {date.today()}"}, "sheets": list(map(lambda d: {"properties": {"title": d.get("title")}}, data))} res = sheets.create(body=create_body).execute() spreadsheet_id = res.get("spreadsheetId") # Transform the DataFrame into a matrix of the columns and values def df_to_sheet(df): df_columns = [np.array(df.columns)] df_values = df.values.tolist() df_to_sheet = np.concatenate((df_columns, df_values)).tolist() return df_to_sheet update_body = { "valueInputOption": "RAW", "data": list(map(lambda d: {"range": d.get("title"), "values": df_to_sheet(d.get("df"))}, data)) } sheets.values().batchUpdate(spreadsheetId=spreadsheet_id, body=update_body).execute() return res
Вышеуказанная функция может быть названа следующей:
data = [ { "title": "Tab/Sheet Title", "df": pd.DataFrame({}) } ] res = create_sheet("Title", data=data)
С res
быть экземпляр электронной таблицы Анкет
Теперь, когда наша электронная таблица была успешно создана, в настоящее время она доступна только пользователю в нашем файле учетных данных, поэтому нам нужно определить функцию, чтобы поделиться ею.
def share_spreadsheet(spreadsheet_id, options, notify=False): drive_service = build("drive", "v3", credentials=credentials) res = ( drive_service.permissions() .create( fileId=spreadsheet_id, body=options, sendNotificationEmail=notify, ) .execute() ) return res
Все возможные значения для аргумента параметров можно найти на Drive API документация . Вы можете поделиться им с конкретным пользователем или предоставить доступ к каждой учетной записи в соответствии с определенным доменом.
Мы можем определить основную функцию, которая объединяет как создание, так и обмен сценариями, и возвращает URL -адрес электронной таблицы.
def create_and_share_spreadsheet(title, data, permissions): sheet = create_sheet(title, data) share_spreadsheet(sheet.get("spreadsheetId"), options=permissions.get( "info"), notify=permissions.get("notify")) return sheet.get("spreadsheetUrl")
Вуаля, все это, собранное в файле, можно найти в этом суть . Там еще много места для улучшения, поэтому он может получить некоторые обновления, которые будут отличаться от фрагментов этого поста.
Спасибо за чтение!
Оригинал: “https://dev.to/olarclara/exporting-pandas-dataframes-to-google-sheets-33e8”