1 Востаннє редагувалося frz (22.04.2022 18:03:44)

Тема: отримання даних з google spreadsheet в pandas dataframe

Розгадую ребус, який колись вже успішно вирішив 4-5 років тому, і ось мушу знову, бо щось не бачу своїх давніших записів на цю тему.

from __future__ import print_function

import os.path

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']

SAMPLE_SPREADSHEET_ID = 'my_spreadhseet_id'
SAMPLE_RANGE_NAME = 'abc1!A4:C'


def main():
    creds = None
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('sheets', 'v4', credentials=creds)

        sheet = service.spreadsheets()
        result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,
                                    range=SAMPLE_RANGE_NAME).execute()
        values = result.get('values', [])

        if not values:
            print('No data found.')
            return

        print('my values:')
        for row in values:
            print('%s, %s' % (row[0], row[4]))
    except HttpError as err:
        print(err)


if __name__ == '__main__':
    main()

Відкривається (1) url https://accounts.google.com/o/oauth2/au … ent_id=... і просить моєї авторизації, після чого - спроба відкрити інший (2) url http://localhost:8080/?state=vb4.............&code=4/0AX4...........&scope=https://www.googleapis.com/auth/spreadsheets.readonly - але оскільки нема ніякого вебсервера на localhost, то браузер очікувано повертає помилку.

І тут пригадую що колись брав параметри з (2) url і надсилав POST запит щоб згенерувати token.json, після чого оновлення кредів відбувається автоматично. Імовірність що тут ще хтось таким займався - низька, але вирішив зафіксувати тут свої думки на потім принаймні для самого себе.

2

Re: отримання даних з google spreadsheet в pandas dataframe

ось потрібний запит, котрий повертає токен, його потрібно зберегти в token.json і покласти в ту ж папку де лежить Python скрипт, після чого оновлення токену відбувається автоматично

curl -H "Content-Type: application/x-www-form-urlencoded" -X POST "https://accounts.google.com/o/oauth2/token" -d "code=4/0AX4.....&client_id=4923.....&client_secret=GOC.....&redirect_uri=http://localhost:8080/&grant_type=authorization_code"

3 Востаннє редагувалося frz (28.04.2022 14:48:30)

Re: отримання даних з google spreadsheet в pandas dataframe

Ось який виходить pandas dataframe:

0     1          2     3     4   ...     21     22     23     24     25
0    col1  col2       col3  col4  col5  ...  col22  col23  col24  col25  col26
1       1     a   1/1/2022     a     a  ...      a      a      a      a      a
2       2     b   1/2/2022     b     b  ...      b      b      b      b      b
3       3     c   1/3/2022     c     c  ...      c      c      c      c      c
4       4     a   1/4/2022     a     a  ...      a      a      a      a      a
..    ...   ...        ...   ...   ...  ...    ...    ...    ...    ...    ...
995   995     b  9/21/2024     b     b  ...      b      b      b      b      b
996   996     c  9/22/2024     c     c  ...      c      c      c      c      c
997   997     a  9/23/2024     a     a  ...      a      a      a      a      a
998   998     b  9/24/2024     b     b  ...      b      b      b      b      b
999   999     c  9/25/2024     c     c  ...      c      c      c      c      c

(перший рядок даних - це перелік назв колонок з google spreadsheet)

Як переіменувати колонки датафрейму відповідно до першого рядка даних?...

----

Upd: ґуґлю "pandas first row as header"...

----

Upd: дуже просто

dataframe.columns = dataframe.iloc[0] 
dataframe = dataframe[1:]
dataframe.head()