GSpread

4 minuto(s) de leitura

O GSpread é um pacote que possibilita a edição e obtenção de dados das planilhas do Google SpreadSheet, utilizando Python. Ou seja, é possível manipular os dados utiliznado toda uma variedade de packages do Python e inseri-los em Google Spreadsheets.

Outro pacote relevante para trabalhar junto é o df2gspread, que lê a tabela no formado do Pandas.


Aviso: Esse post tem a finalidade de mostrar os comandos básicos e me deixar com uma “cola” rápida para meu uso cotidiano. Todas os códigos são exemplificativos e podem/devem ser alterados, indicando o nome dos arquivos e diretórios corretamente.

Nota: É possível acessar esse post em formato pdf, diretamente por meio do repositório do GitHub ou ainda, de maneira interativa, usando o Binder.


Importando Bibliotecas

As bibliotecas básicas, ou packages, necessárias para criação do mapa são:

  • O GSpread, que é a biblioteca que lê e edita as tabelas do Google;
  • O df2gspread é uma biblioteca que, junto com o GSpread, lê e escreve as tabelas no formato do Pandas.
import gspread
from oauth2client.service_account import ServiceAccountCredentials

from df2gspread import df2gspread as d2g
from df2gspread import gspread2df as g2d


Autenticando no Google Spreadsheet

Códigos necessários para “entrar” em modo de edição de uma planilha, a partir do python.

# Escopo Utilizado
scope = ['https://spreadsheets.google.com/feeds']

api_file = 'python-gspread-credentials.json'

# Lê a Credencial para Autenticação
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    os.path.join('..', 'codes/vault', api_file),
    scope)

# Autenticação, de fato
gc = gspread.authorize(credentials)


Escolhe a planilha e aba a ser editada

# Abre a Planilha
wkb = gc.open_by_key('1bRwjoieInaRkmoyvlisMtDi-2kZ-5CvyKEQ2V_Xk1U8')    # Pelo ID da planilha
#wkb = gc.open_by_url('https://docs.google.com/spreadsheets/d/1bRwjoieInaRkmoyvlisMtDi-2kZ-5CvyKEQ2V_Xk1U8/edit#gid=0')    # Pela URL da planilha
#wkb = gc.open('Teste Python')               # Pelo nome da planilha

# Seleciona a primeira página da planilha
wks = wkb.get_worksheet(0)             # Pela ordem, começando com 0
#wks = wkb.worksheet('January')        # Pelo nome da aba


Escrevendo Dados

Célula Individual

# Pela notação padrão do Google Spreadshhet
wks.update_acell('A1', 'Dia e Hora')
# Pela notação de coordenadas
wks.update_cell(1, 2, 'Bingo!')
%run '~/Documents/SourceCode/codes/files/str_today.py'
wks.update_acell('A2', srt_today())


Conjunto de Células

# Cabeçalho
wks.update_acell('A1', 'Estado')
wks.update_acell('B1', 'Capital')

# Dicionário com os estados e as capitais
capitais = {'Paraíba': 'João Pessoa', 'Santa Catarina': 'Florianópolis', 'São Paulo': 'São Paulo'}

# Contador de colunas e celulas
column = 1
row = 2

for estado, capital in capitais.items():
    # Atualiza a celula 2 da coluna 1 com o nome do estado
    wks.update_cell(row, column, estado)

    # A coluna agora é a B
    column = 2

    # Atualiza a celula 2 da coluna 2 com o nome da capital
    wks.update_cell(row, column, capital)

    # A coluna agora é a A
    column = 1

    # Acrescenta mais um valor no numero da celula
    row += 1
# Atualiza um Conjunto de Células iguais
cell_list = wks.range('A1:C7')

for cell in cell_list:
    cell.value = '00'

# Update in batch
wks.update_cells(cell_list)

Arquivo para Google Spreadsheet

# Lendo e filtrando dados
empresas = pd.read_csv('data/empresas.xz')
empresas = empresas[empresas['state'] == 'SP']
empresas = empresas[empresas['city'] == 'SANTOS']

empresas.dtypes
from df2gspread import df2gspread as d2g

d2g.upload(empresas,
           gfile='1bRwjoieInaRkmoyvlisMtDi-2kZ-5CvyKEQ2V_Xk1U8',
           wks_name='Página1',
           start_cell='A1',
           credentials=credentials,
           col_names=True,
           row_names=False,
           clean=False)
wks.title

Lendo Dados

Célula Individual

# Pega o valor específico de uma célula
val = wks.cell(1,1).value
print(val)
val = wks.acell('A3').value
print(val)
# Seleciona todos os dados de uma coluna
val = wks.col_values(1)
print(val)
# Seleciona todos os dados de uma linha
val = wks.row_values(1)
print(val)
# Procurando uma localização específica
cell = wks.find('CENTRO')
print(f'Encontrado na celula {cell.row} coluna {cell.col}')
# Gera uma lista de listas
list_of_lists = wks.get_all_values()
list_of_lists

Google Spreadsheet para arquivo

from df2gspread import gspread2df as g2d

tab = g2d.download(gfile='1bRwjoieInaRkmoyvlisMtDi-2kZ-5CvyKEQ2V_Xk1U8',
                   wks_name='Página1',
                   start_cell='A1',
                   credentials=credentials,
                   col_names=True,
                   row_names=False)

tab.head(2)
# Lixo, com o df2gspread passou a ser desnecessário esse código
import pandas as pd

data = wks.get_all_values()
#data = wks.get_all_records(empty2zero=False, head=4, default_blank='',allow_underscores_in_numeric_literals=False)
headers = data.pop(0)

tab = pd.DataFrame(data, columns=headers)

tab.head(2)


Referências

  • Toda introdução está em https://www.linkedin.com/pulse/manipulando-planilhas-do-google-usando-python-renan-pessoa
  • Um guia de referências https://gspread.readthedocs.io/en/latest/user-guide.html
  • https://df2gspread.readthedocs.io/en/latest/index.html


Exportando o Juptyter Notebook para outros formatos

O arquivo .ipynb pode ser exportado em formatos diversos. Abaixo carrego uma função que escrevi para facilitar o processo de exportação do arquivo em diferentes locais do PC para, posteriormente, atualizar os repositórios contidos no GitHub.

# %load '~/Documents/SourceCode/codes/files/export_jupyter.py'
def export_jupyter(path, extensions=['html', 'markdown', 'latex', 'pdf', 'python'], today=True):
    """
    Export .ipynb file to others formats
    :return: File in other formats
    """
    # Import Packages
    import os
    import datetime

    # Data
    timestamp = datetime.datetime.now()
    srt_today = (str(timestamp.year) + '-' +
                 str(f"{timestamp.month:02d}") + '-' +
                 str(f"{timestamp.day:02d}"))

    # Extensions
    for extension in extensions:
        if today==True:
            os.system('jupyter nbconvert --to {} {} --output {}'.
                      format(extension, get_jupyternotebook_name(),
                             os.path.join(path, srt_today+'-'+get_jupyternotebook_name().split('.')[0])))
            print('Arquivo {} exportado corretamente para o formato {} usando prefixo da data.'.
                  format(get_jupyternotebook_name(), extension))

        else:
            os.system('jupyter nbconvert --to {} {} --output {}'.
                      format(extension, get_jupyternotebook_name(),
                             os.path.join(path, get_jupyternotebook_name().split('.')[0])))
            print('Arquivo {} exportado corretamente para o formato {} sem usar prefixo da data.'.
                  format(get_jupyternotebook_name(), extension))

# %load '~/Documents/SourceCode/codes/files/get_jupyternotebook_name.py'
def get_jupyternotebook_name():
    """
    Returns the name of the current notebook as a string
    From https://mail.scipy.org/pipermail/ipython-dev/2014-June/014096.html
    :return: Returns the name of the current notebook as a string
    """
    # Import Packages
    from IPython.core.display import Javascript
    from IPython.display import display

    display(Javascript('IPython.notebook.kernel.execute("theNotebook = " + \
    "\'"+IPython.notebook.notebook_name+"\'");'))

    # Result
    return theNotebook

Com as funções para exportar o Jupyter Notebook e para obter o nome do arquivo .ipynb carregadas, basta exportar o arquivo, inicialmente para a pasta docs dentro do projeto e também, visando atualizar os posts do site, para a respectiva pasta.

export_jupyter('docs',['pdf'], False)
export_jupyter('/home/michel/Documents/SourceCode/michelmetran.github.io/_posts', ['markdown'], True)


Atualizando Repositório do Projeto e do site

Após as exportações dos arquivos nos formatos necessários, basta atualizar o repositório diretamente pelo Jupyter Notebook. Abaixo é atualizado o repositório desse projeto específico, bem como a derivação desse projeto no site.

%run '~/Documents/SourceCode/codes/git/update_github.py'
git_full('/home/michel/Documents/SourceCode/package_gspread', '.', 'Atualizando')
git_full('/home/michel/Documents/SourceCode/michelmetran.github.io', '.', 'Atualizando')

Deixe um comentário