Blog

Postado em em 9 de novembro de 2023

Freela de 500 Dólares em Python – Automação de Planilhas

Quer saber como fazer um freela de 500 dólares em Python? Preparei esta aula para te ensinar um projeto real que pode te garantir uma renda extra!

Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo ou acesse o nosso canal do YouTube!

Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:

Freela de 500 Dólares em Python – Automação de Planilhas

Na aula de hoje, eu quero te apresentar mais uma oportunidade de freela de Python! Vamos construir juntos um projeto real que pode te garantir uma renda extra. Vou te mostrar um freela de 500 dólares em Python.

Esse projeto foi retirado do site do Workana, oferecendo de 250 a 500 dólares para desenvolver uma automação de planilhas em Excel. O programa deve pegar um arquivo em CSV, consolidar em Excel e enviar uma atualização diária dessa planilha por e-mail.

E é esse o projeto freela de 500 dólares em Python que iremos desenvolver nessa aula, criando uma automação de planilhas com Python!

Para desenvolver nossa automação com Python eu criei algumas bases de dados em CSV para utilizarmos como exemplo. Portanto, não deixe de baixar os arquivos da aula para que você possa acompanhar e aprender o passo a passo para desenvolver essa automação em Python.

Além disso, precisaremos utilizar um editor de códigos. Eu estarei utilizando o VS Code como editor para esse projeto, mas sinta-se à vontade para utilizar qualquer outro editor com o qual você esteja familiarizado.

Explicação da Base de Dados

Feito o download dos arquivos no material da aula, salve todos os arquivos CSV em uma mesma pasta. Essa será a base de dados com a qual iremos trabalhar.

Esses arquivos contêm informações sobre as nossas vendas, elas representam as vendas de vários produtos ao longo de vários dias diferentes.

Objetivo do Projeto

A partir da base de dados que temos disponível, nosso objetivo é consolidar essas planilhas no Excel e enviar um relatório com a planilha final por e-mail.

Esse processo deverá ser realizado diariamente. Assim, no dia seguinte, uma nova base de dados estará pronta para ser consolidada, e um novo e-mail com o relatório atualizado deverá ser enviado.

Bibliotecas Necessárias

Para execução desse projeto vamos precisar utilizar algumas bibliotecas do Python.

Como estamos trabalhando com bases de dados no Python, vamos utilizar a biblioteca do Pandas para lidar com esses dados.

Também iremos manipular arquivos no nosso computador, para isso vamos usar a biblioteca OS, uma biblioteca padrão do Python.

E, por fim, utilizaremos a biblioteca PyWin32 que nos permitirá fazer o disparo de e-mails automático.

Observação: Caso você prefira utilizar o Gmail pode conferir como fazer isso nessa aula.

Para instalar o Pandas e o PyWin32 abra o terminal do seu editor de códigos e execute:

pip install pandas numpy openpyxl pywin32

Além das bibliotecas do Pandas e do PyWin32, instalamos também as bibliotecas do Numpy e do OpenPyXL que auxiliarão o Pandas a trabalhar de forma eficiente com a nossa base de dados e o Excel.

Por fim, para lidarmos com as datas na nossa base de dados, utilizaremos a biblioteca datetime padrão do Python.

Então podemos importar todas as bibliotecas necessárias para o nosso código e iniciar o desenvolvimento do nosso projeto de automação de planilhas com Python.

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

Desenvolvendo o Projeto

Com as bibliotecas necessárias instaladas, podemos partir para o desenvolvimento do nosso projeto de automação e construir esse freela de 500 dólares em Python.

Nosso primeiro passo será listar todos os arquivos da nossa pasta bases, onde estão os arquivos CSV. Faremos isso utilizando a biblioteca OS e a função listdir().

Essa função recebe como parâmetro o caminho para um diretório e retorna uma lista com os nomes de todos os arquivos e diretórios contidos nele.

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

caminho = "bases"
arquivos = os.listdir(caminho)
print(arquivos)
Listando a base de dados

Observação: Como meu código e a pasta com as bases de dados estão no mesmo local, eu posso passar para a variável caminho apenas o nome da pasta. Se no seu caso a pasta com os arquivos estiver em outro local do computador, você deve passar o caminho completo para esse diretório.

Definindo o caminho dos arquivos

Nosso objetivo nessa etapa será abrir cada um desses arquivos e consolidá-los em uma planilha no Excel. Ou seja, precisamos criar uma tabela que receberá as 4 bases de dados.

Vamos criar nossa tabela chamada tabela_consolidada através de um DataFrame vazio do Pandas.

A partir disso, iremos percorrer cada arquivo da nossa lista de arquivos usando um loop for. Para cada arquivo, leremos as informações contidas nele através da função read_csv() do Pandas.

Para essa função, precisamos passar o caminho completo do arquivo (nome da pasta + nome do arquivo). Então, utilizaremos novamente a biblioteca OS para concatenar essas duas informações utilizando a função join().

Para visualizarmos os dados da nossa base de dados e verificar se estão todos corretos, podemos chamar um print das nossas tabelas dentro do for.

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

caminho = "bases"
arquivos = os.listdir(caminho)
print(arquivos)

tabela_consolidada = pd.DataFrame()

for nome_arquivo in arquivos:
    tabela_vendas = pd.read_csv(os.path.join(caminho, nome_arquivo))
    print(tabela_vendas)
Visualizando tabela de vendas

Até aqui, o nosso código já está listando os arquivos da nossa base de dados e lendo cada um deles individualmente. Porém, repare que a coluna Data de Venda das nossas tabelas não estão formatadas corretamente.

Vamos entender por que nossas datas vieram dessa forma. Para o Excel, o número 45223, que podemos ver na coluna Data de Venda, é uma data.

O Excel considera a data 01/01/1900 como a data inicial. Essa seria a data 1, e a partir dela teríamos a data 2, 3 e assim sucessivamente até chegarmos no número 45223 e os demais números que podemos visualizar na nossa tabela.

Dessa forma, para converter adequadamente os números da nossa tabela em datas, é necessário somar a data inicial do Excel ao número presente na tabela e subtrair 2.

Para realizar essa conversão, pegaremos a coluna Data de Venda da tabela_vendas (que corresponde a cada uma das bases de dados dentro do nosso loop for). Utilizaremos a função pd.to_datetime para passar a data inicial do Excel 01/01/1900, e somaremos com a função pd.to_timedelta(), passando como parâmetros a nossa coluna Data de Venda e subtraindo 2.

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

caminho = "bases"
arquivos = os.listdir(caminho)
print(arquivos)

tabela_consolidada = pd.DataFrame()

for nome_arquivo in arquivos:
    tabela_vendas = pd.read_csv(os.path.join(caminho, nome_arquivo))
    tabela_vendas["Data de Venda"] = pd.to_datetime("01/01/1900") + pd.to_timedelta(tabela_vendas["Data de Venda"] - 2, unit="d")
    print(tabela_vendas)

Importante observar que também adicionamos o parâmetro unit=”d” para determinar que estamos trabalhando com dias.

Isso fará com que a data inicial do Excel seja somada à quantidade de dias presentes em nossas tabelas e, em seguida, subtrairá 2 dias para corrigir um problema na conversão de datas que faz com que a data fique dois dias adiantada.

Visualizando tabela com as datas corrigidas

Com isso, nossa base de dados está tratada, e agora podemos consolidá-la em uma única tabela. Para isso, vamos adicionar um trecho ao nosso código utilizando a função concat para concatenar o DataFrame tabela_vendas com a tabela tabela_consolidada que criamos vazia.

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

caminho = "bases"
arquivos = os.listdir(caminho)
print(arquivos)

tabela_consolidada = pd.DataFrame()

for nome_arquivo in arquivos:
    tabela_vendas = pd.read_csv(os.path.join(caminho, nome_arquivo))
    tabela_vendas["Data de Venda"] = pd.to_datetime("01/01/1900") + pd.to_timedelta(tabela_vendas["Data de Venda"] - 2, unit="d")
    tabela_consolidada = pd.concat([tabela_consolidada, tabela_vendas])

print(tabela_consolidada)
Visualizando tabela consolidada

Isso é possível porque todas as nossas tabelas possuem as mesmas colunas, permitindo a concatenação sem maiores problemas.

Porém, é importante notar que as datas nas tabelas da nossa base de dados não estão em ordem. Podemos ordená-las usando a função sort_values, passando a Data de Venda como argumento. Isso organizará nossa tabela da data mais antiga para a mais recente.

Em seguida, vamos redefinir o índice do nosso DataFrame para que ele considere todas as linhas presentes na tabela resultante, utilizando a função reset_index e passando o argumento drop=True.

O argumento drop=True indica que o índice anterior será descartado após a criação do novo índice com a função reset_index.

Por fim, precisamos salvar nossa tabela_consolidada em um arquivo Excel, como solicitado no projeto. Para fazer isso com o Pandas, podemos utilizar a função to_excel(), passando o nome que queremos dar ao nosso arquivo.

Como no Excel já teremos um índice com a numeração das linhas, podemos remover o índice atual da nossa tabela passando o argumento index=False.

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

caminho = "bases"
arquivos = os.listdir(caminho)
print(arquivos)

tabela_consolidada = pd.DataFrame()

for nome_arquivo in arquivos:
    tabela_vendas = pd.read_csv(os.path.join(caminho, nome_arquivo))
    tabela_vendas["Data de Venda"] = pd.to_datetime("01/01/1900") + pd.to_timedelta(tabela_vendas["Data de Venda"] - 2, unit="d")
    tabela_consolidada = pd.concat([tabela_consolidada, tabela_vendas])

tabela_consolidada = tabela_consolidada.sort_values(by="Data de Venda")
tabela_consolidada = tabela_consolidada.reset_index(drop=True)
tabela_consolidada.to_excel("Vendas.xlsx", index=False)

Com isso teremos nosso arquivo Vendas.xlsx salvo na mesma pasta em que estamos executando o código.

Arquivo criado

Com esse código, é possível atualizar esse arquivo diariamente, semanalmente ou conforme desejarmos, pois ele percorrerá toda a base de dados atual e a consolidará em um único arquivo Excel.

Agora, a única etapa restante é enviar o e-mail com o relatório e a planilha final em anexo. Para isso, utilizaremos a biblioteca PyWin32 que já importamos como win32.

E vamos utilizar um código que é padrão quando queremos conectar o Python com o Outlook. Faremos isso criando o objeto outlook utilizando a função Dispatch() e tendo como argumento o nome da aplicação que queremos executar, que é o outlook.application.

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

caminho = "bases"
arquivos = os.listdir(caminho)
print(arquivos)

tabela_consolidada = pd.DataFrame()

for nome_arquivo in arquivos:
    tabela_vendas = pd.read_csv(os.path.join(caminho, nome_arquivo))
    tabela_vendas["Data de Venda"] = pd.to_datetime("01/01/1900") + pd.to_timedelta(tabela_vendas["Data de Venda"] - 2, unit="d")
    tabela_consolidada = pd.concat([tabela_consolidada, tabela_vendas])

tabela_consolidada = tabela_consolidada.sort_values(by="Data de Venda")
tabela_consolidada = tabela_consolidada.reset_index(drop=True)
tabela_consolidada.to_excel("Vendas.xlsx", index=False)

outlook = win32.Dispatch('outlook.application')

Importante: Para que o seu código funcione e estabeleça a conexão com o Outlook, é necessário que o Outlook esteja habilitado no seu computador com o e-mail configurado e funcionando.

Depois disso, vamos criar o e-mail utilizando o método CreateItem(0) e passaremos o destinatário para o email.To. Em seguida precisamos passar o assunto para email.Subject.

No entanto, vamos personalizar ainda mais este campo. Antes de definir o assunto do nosso e-mail, vamos obter a data atual por meio da biblioteca datetime e usá-la para adicionar automaticamente a data atual tanto no assunto quanto no corpo do e-mail (email.Body).

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

caminho = "bases"
arquivos = os.listdir(caminho)
print(arquivos)

tabela_consolidada = pd.DataFrame()

for nome_arquivo in arquivos:
    tabela_vendas = pd.read_csv(os.path.join(caminho, nome_arquivo))
    tabela_vendas["Data de Venda"] = pd.to_datetime("01/01/1900") + pd.to_timedelta(tabela_vendas["Data de Venda"] - 2, unit="d")
    tabela_consolidada = pd.concat([tabela_consolidada, tabela_vendas])

tabela_consolidada = tabela_consolidada.sort_values(by="Data de Venda")
tabela_consolidada = tabela_consolidada.reset_index(drop=True)
tabela_consolidada.to_excel("Vendas.xlsx", index=False)

outlook = win32.Dispatch('outlook.application')
email = outlook.CreateItem(0)
email.To = "[email protected]"
data_hoje = datetime.today().strftime("%d/%m/%Y")
email.Subject = f"Relatório de Vendas {data_hoje}"
email.Body = f"""
Prezados,

Segue em anexo o Relatório de Vendas de {data_hoje} atualizado.
Qualquer coisa estou à disposição.
Abs,
Lira Python
"""

Repare que para obter a data atual, utilizamos a função today(), e para formatá-la corretamente no padrão do Brasil, usamos a função strftime(), informando que queremos o dia primeiro (d), depois o mês (m) e por fim o ano (Y).

Além disso, como estamos usando uma variável dentro do texto, precisamos fazer uso das f-strings tanto no corpo do e-mail quanto no assunto.

Com isso, temos o nosso e-mail quase completo. Só falta anexarmos a nossa tabela consolidade e enviar o e-mail.

Para anexar nossa tabela, iremos utilizar novamente a biblioteca os e a função join() para pegar o caminho completo onde está o nosso arquivo, e adicioná-lo ao e-mail através do método email.Attachments.Add(anexo), em que anexo é o caminho do arquivo.

E para finalizar, podemos enviar esse e-mail com a função Send().

Nosso código completo ficará assim:

import os
from datetime import datetime
import pandas as pd
import win32com.client as win32

caminho = "bases"
arquivos = os.listdir(caminho)
print(arquivos)

tabela_consolidada = pd.DataFrame()

for nome_arquivo in arquivos:
    tabela_vendas = pd.read_csv(os.path.join(caminho, nome_arquivo))
    tabela_vendas["Data de Venda"] = pd.to_datetime("01/01/1900") + pd.to_timedelta(tabela_vendas["Data de Venda"] - 2, unit="d")
    tabela_consolidada = pd.concat([tabela_consolidada, tabela_vendas])

tabela_consolidada = tabela_consolidada.sort_values(by="Data de Venda")
tabela_consolidada = tabela_consolidada.reset_index(drop=True)
tabela_consolidada.to_excel("Vendas.xlsx", index=False)

outlook = win32.Dispatch('outlook.application')
email = outlook.CreateItem(0)
email.To = "[email protected]"
data_hoje = datetime.today().strftime("%d/%m/%Y")
email.Subject = f"Relatório de Vendas {data_hoje}"
email.Body = f"""
Prezados,

Segue em anexo o Relatório de Vendas de {data_hoje} atualizado.
Qualquer coisa estou à disposição.
Abs,
Lira Python
"""

caminho = os.getcwd()
anexo = os.path.join(caminho, "Vendas.xlsx")
email.Attachments.Add(anexo)

email.Send()
E-mail enviado

Dessa forma concluímos nossa automação de planilhas com Python e finalizamos nosso freela de 500 dólares em Python.  E você ainda pode levar um passo além agendando esse código para rodar diariamente para você.

Conclusão – Freela de 500 Dólares em Python – Automação de Planilhas com Python

Na aula de hoje, eu trouxe mais um freela de 500 dólares em Python! Um projeto retirado do site do Workana e que construímos juntos cada uma das etapas dele, solucionando assim um case real com Python.

Nesse projeto você aprendeu como desenvolver uma automação de planilhas em Excel que pega um arquivo em CSV, consolida em Excel e envia uma atualização diária dessa planilha por e-mail.

Com prática, estudo e domínio do Python é possível resolver ainda mais casos reais como esse e conseguir uma renda extra, como esse freela de 500 dólares em Python que desenvolvemos hoje.

Hashtag Treinamentos

Para acessar outras publicações de Python, clique aqui!


Quer aprender mais sobre Python com um minicurso básico gratuito?