Vamos começar com uma ideia. Digamos que você, como verdadeiro auditor, queira fazer um exame dos relatórios do criador de cães, usando, entre outras coisas, recursos de terceiros. Para fazer isso, você tenta obter informações sistematizadas sobre os filhotes do criador, sabendo, por exemplo, apenas o nome de suas raças, e criar uma tabela a partir dela em Pandas, adequada para processamento posterior de qualquer natureza (todos os tipos de pesquisa estatística, agregação, etc.). Mas seus dados são armazenados em algum site abstrato, de onde você pode retirá-los apenas na forma de um arquivo, onde estão empilhados documentos de vários formatos, dentro dos quais há textos, imagens, tabelas. E se há muitas raças de cachorros, e para cada uma delas há uma dezena de arquivos pdf com tabelas, de onde você não precisa de todas as informações e também, por exemplo, dos nomes dessas tabelas ou notas de rodapé? Vamos adicionar várias funções ao nosso projeto,resolvendo as seguintes tarefas: descarregar e descompactar o arquivo com dados, pesquisar e processar arquivos pdf do arquivo, analisar os dados recebidos.
Primeiro, vamos importar tudo o que precisamos. Vamos dividir as bibliotecas de que precisamos em bibliotecas do sistema:
import os
import re
import glob
import csv
import shutil
e externos que requerem instalação (pip install, como disse):
import requests as req
import pandas as pd
from zipfile import ZipFile
import tabula
import PyPDF2
from pdf2image import convert_from_path
from pytesseract import image_to_string
from PIL import Image, ImageDraw
Agora, para cada um de seus filhotes, faremos o download de um grande arquivo com dados, referindo-se ao site pelo nome de sua raça:
def get_doquments_archive(breed):
url = 'https://yourwebsite' + breed + '/document/download'
with req.get(url, stream=True) as r:
r.raise_for_status()
with open('/Users/user/Desktop/' + breed + '.zip', 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
Agora temos um arquivo em nosso desktop. Vamos descompactá-lo, para isso só precisamos saber o caminho para o arquivo com o arquivo:
def unzipper(zippath, cond = False):
dirpath = zippath[:-4] + '_package'
if os.path.exists(dirpath) and os.path.isdir(dirpath):
shutil.rmtree(dirpath)
os.mkdir(dirpath)
with ZipFile(zippath, 'r') as zipObj:
zipObj.extractall(path = dirpath)
Nesta etapa, obteremos uma pasta com documentos, onde podem estar pdf, csv, xls, png e outras coisas legais. Digamos que desejamos processar vários arquivos PDF contendo tabelas com dados. Mas como tirá-los de lá? Primeiro, vamos selecionar os documentos do formato que precisamos na pasta:
all_pdfs = glob.glob(dirpath + '/*_pd*.pdf')
Excelente. Agora temos um monte de arquivos com texto e tabelas dentro. Ao tentar extrair informações de lá, pode acontecer que tal mistura seja reconhecida pelas ferramentas de forma muito tortuosa, especialmente se as tabelas estiverem coladas umas nas outras e seus títulos ou notas de rodapé forem textos separados. Tabula vem ao resgate! Mas primeiro, vamos tirar da primeira página de cada documento uma pequena descrição textual que não está incluída na tabela (esse texto para uma tabula pode ser um problema). Como a primeira página também pode ter uma tabela, vamos usar o foco:
def get_text_description(path):
pdfFileObj = open(path,'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
pages = convert_from_path(declar, 0)
page = pages[0]
pname = '/Users/user/Desktop/text_description.png'
page.save(pname, 'JPEG')
text = image_to_string(Image.open('/Users/user/Desktop/text_description.png'),
lang = 'rus')
text_file = open('res', "w")
text_file.write(text)
text_file.close()
Agora vamos começar a trabalhar com a mesa. Se você tiver sorte, e a tabela em nosso pdf for bastante legível, a tabula irá carregá-la corretamente no formato csv, então você nem precisa analisar as informações:
tabula.convert_into(file, 'output_file.csv', output_format = "csv", pages = 'all')
Veja como agora pode ser simples obter, por exemplo, dados sobre o caráter do cachorro selecionado:
data = pd.read_csv('/Users/user/Desktop/output_file.csv')
temperament = data[data[''] == '']['']
Mas se o autor do texto colasse as tabelas, adicionasse um número diferente de colunas às linhas ou as misturasse com o texto? Em seguida, converteremos o arquivo recebido da tabula em um novo formato:
def get_table_data(path):
data = []
with open(path) as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
for val in row.values():
data.append(val)
data = str(data)
data = re.sub('\]|\[|,|\'', '', data)
data = data.replace("\\n", "")
return data
Para quê? Isso permitirá que você pesquise as informações de que precisa de forma rápida e indolor, usando expressões regulares. Queremos encontrar um conjunto de cores de raça possíveis:
def get_colors(data):
res = re.search('^: (.*)', data).group(1)
return res
Agora acumulamos uma certa quantidade de informações de arquivos um por um filhote (por exemplo, personagem, cores, peso). Vamos adicioná-lo ao dataframe do pandas como uma nova linha:
def append_new_row(dataframe, breed, temperament, colors, weight):
return dataframe.append({'': breed,
'': temperament,
'': colors,
'' : weight
}, ignore_index=True)
O que temos agora:
Então, nós descarregamos um arquivo com os dados do site, descompactamos, retiramos os documentos que precisávamos, pegamos informações importantes deles e trouxemos para um formato conveniente. Agora esses dados podem ser comparados com os fornecidos pela empresa, convertidos e analisados, e muito mais! Muito mais conveniente do que baixar e escrever manualmente.
def clean_all(path):
os.remove(path + '.zip')
shutil.rmtree(path + '_package')
É importante que suas ações permaneçam totalmente legais. Você pode obter dados de sites, não pode roubar conteúdo. Você pode baixar automaticamente, você não pode colocar o servidor. Direitos autorais do estudo e do Código Penal da Federação Russa, não causam danos.