Acessando FTP e descompactando arquivos com Python
Sabemos que existem milhares de dados abertos “vagando” pela internet e fazer uso deles pode ser um fator importante para que sua empresa se mantenha competitiva.
Muitas empresas já entenderam e até fazem uso desses dados porém, de forma manual. E se pudéssemos baixar, tratar e consumir esses dados de forma totalmente automática?
Com um código simples de 40 linhas é possível fazer isso e otimizar o fluxo de trabalho ganhando tempo e aumentando a produtividade.
Neste case de estudo será utilizado como fonte de dados o FTP do Ministério do Trabalho e Previdência Social e iremos acessar a lista de CAEPI (Certificado de Aprovação de Equipamentos de Proteção Individual) porém a utilidade deste código não se limita apenas a essa aplicação apenas necessitando curtas alterações. Então vamos ao código:
Importar as bibliotecas
Python possui várias funções já “embutidas” em seu código mas é possível estender suas funcionalidades com bibliotecas, algumas que já vem juntas na instalação e outras que podem ser instaladas com um simples comando “pip install”.
Para começar importe as bibliotecas que iremos trabalhar usando o código abaixo:
import ftplib
import patoolib
import csv
import pandas as pd
import os
Definir vaiáveis
Será necessário definir algumas variáveis de conexão ao FTP, pasta que iremos acessar durante a conexão e também o local onde salvaremos os arquivos baixados e extraídos. No código a seguir temos uma breve explicação junto de cada comando.
# Endereço do FTP que você tem interesse em conectar
ftp = ftplib.FTP("ftp.mtps.gov.br")
# Como este FTP não precisa de usuário e senha, basta solicitar o login sem estes parâmetros
ftp.login()
# Este comando indica para qual pasta você pretende navegar.
ftp.cwd('portal/fiscalizacao/seguranca-e-saude-no-trabalho/caepi')
# esses caminhos serão utilizados para salvar os arquivos baixados e extraidos.
caminho_pasta = 'C:/Projetos Python/ftp_mtps_gov/'
caminho_arquivo_txt = 'c:/Projetos Python/ftp_mtps_gov/tgg_export_caepi.txt'
Limpando o caminho
Em nosso case de estudo iremos sempre iniciar com uma limpeza na pasta onde os dados serão salvos. Isso visa evitar futuros problemas como ter dados antigos ou o código “travar” por existir um arquivo de mesmo nome já salvo na pasta. Para isso use o código abaixo:
try:
os.remove(caminho_arquivo_txt)
os.remove(caminho_pasta + 'tgg_export_caepi.zip')
except:
# e caso eles não existam, apenas passe para o próximo comando.
pass
Capturando os dados
Após passarmos pelos processos anteriores vamos começar. Primeiro passo será definir uma função que será a responsável pelo acesso a pasta e o download do arquivo. Essa função receberá 2 parâmetros, um de conexão de outro com o nome do arquivo.
def getFile(ftp, filename):
try:
ftp.retrbinary("RETR " + filename, open(caminho_pasta + filename, 'wb').write)
except:
print("Error")
Agora é só chamar essa função através do comando
getFile(ftp, 'tgg_export_caepi.zip')
Descompactar e converter para CSV
Pronto, seu arquivo já está salvo na pasta de destino, mas ele ainda está compactado. Para resolver esse problema é muito simples, uma linha de código já é suficiente para resolver isso.
patoolib.extract_archive(caminho_pasta + "tgg_export_caepi.zip", outdir=caminho_pasta)
Caso sua intenção seja utilizar o arquivo no formato original .txt o trabalho se encerra aqui. Caso queira, é possível converter ele para .csv ou mesmo salvar em seu DW (se você não sabe o que é um DW clique aqui e leia meu artigo que trata esse assunto). Então, vamos o código:
with open('c:/Projetos Python/ftp_mtps_gov/tgg_export_caepi.txt') as csvfile:
reader = csv.reader(csvfile)
array_completo = []
for row in reader:
row = str(row).replace("[", '').replace(']', '').replace("'", '').split("|")
array_completo.append(row)
df = pd.DataFrame(array_completo)
# Datafreme montado agora é salvar em .csv
df.to_csv(caminho_pasta + 'tgg_export_caepi.csv', index=False, encoding='UTF-8', header=0)
Para o case de estudo decidi salvar em .csv mesmo, no meu próximo artigo será utilizado como destino um DW.
Pronto, trabalho finalizado com sucesso com apenas 40 linhas de código (ou menos se não contar os espaços padrão entre as linhas) foi possível automatizar um processo antes manual. Para baixar o código completo é só clicar aqui e acessar a pasta do projeto no github.
Database Administrator | DP-900 | DBA SQL Server | DBA AzureSQL | DBA MongoDB | Pervasive PSQL | Zabbix | Python | Linux
1 aBoa Jones. Obrigado.
Supervisor Redes
2 aBoa tarde Jones e se o ftp que eu quero acessa, precisa de usuario e senha como seria? estou inciando ainda rsrsrs
AI | NLP | Data Science | GDG Organizer
4 aJones, muito obrigado! Olhei mais de 20 pessoas explicando, mas consegui apenas da forma que você explicou. Obrigado!
SAP ABAP S/4HANA | ABAP RAP | CDS View | Fiori Elements | BTP CI/CPI
6 aBoa! já estou colocando em prática!