Empecemos con una idea. Digamos que usted, como un auditor real, desea realizar un examen de los informes del criador de perros, utilizando, entre otras cosas, recursos de terceros. Para hacer esto, intente obtener información sistematizada sobre los cachorros del criador, conociendo, por ejemplo, solo el nombre de sus razas, y cree una tabla a partir de ella en Pandas, adecuada para su posterior procesamiento de cualquier naturaleza (todo tipo de investigación estadística, agregación, etc.). Pero sus datos se almacenan en lo profundo de algún sitio web abstracto, de donde puede sacarlos solo en forma de archivo, donde se apilan documentos de varios formatos, dentro del cual hay texto, imágenes, tablas. Y si hay muchas razas de cachorros, y para cada una de ellas hay una docena de archivos pdf con tablas, ¿de dónde no necesita toda la información y también, por ejemplo, necesita los nombres de estas tablas o notas al pie? Agreguemos varias funciones a nuestro proyecto,resolviendo las siguientes tareas: descargar y descomprimir el archivo con datos, buscar y procesar archivos pdf del archivo, analizar los datos recibidos.
Primero, importemos todo lo que necesitemos. Dividamos las bibliotecas que necesitamos en bibliotecas del sistema:
import os
import re
import glob
import csv
import shutil
y externos que requieren instalación (pip install, como dije):
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
Ahora, para cada uno de sus cachorros, descargaremos un gran archivo con datos, refiriéndonos al sitio por el nombre de su raza:
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)
Ahora tenemos un archivo en nuestro escritorio. Descomprimámoslo, para esto solo necesitamos saber la ruta al archivo con el archivo:
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)
En este paso, obtendremos una carpeta con documentos, donde pueden estar pdf, csv, xls, png y otras cosas bonitas. Digamos que queremos procesar varios archivos pdf que contienen tablas con datos. ¿Pero cómo sacarlos de allí? Primero, seleccionemos los documentos del formato que necesitamos de la carpeta:
all_pdfs = glob.glob(dirpath + '/*_pd*.pdf')
Excelente. Ahora tenemos un montón de archivos con texto y tablas adentro. Al intentar extraer información de allí, puede resultar que las herramientas reconozcan tal mezcla de manera muy torcida, especialmente si las tablas están pegadas entre sí y sus títulos o notas al pie son texto separado. ¡Tabula viene al rescate! Pero primero, saquemos de la primera página de cada documento una pequeña descripción textual que no está incluida en la tabla (tal texto para una tabula puede ser un problema). Dado que la primera página también puede tener una tabla, usemos el enfoque:
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()
Ahora comencemos a trabajar con la tabla. Si tiene suerte y la tabla en nuestro pdf es bastante legible, tabula la cargará correctamente en formato csv, por lo que ni siquiera tendrá que analizar la información:
tabula.convert_into(file, 'output_file.csv', output_format = "csv", pages = 'all')
Vea cómo ahora puede ser simple obtener, por ejemplo, datos sobre el carácter del cachorro seleccionado:
data = pd.read_csv('/Users/user/Desktop/output_file.csv')
temperament = data[data[''] == '']['']
Pero, ¿qué pasa si el autor del texto pega tablas juntas, agrega un número diferente de columnas a las filas o las mezcla con el texto? Luego, convertiremos el archivo recibido de tabula a un nuevo 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é? Esto le permitirá buscar la información que necesita de forma rápida y sin problemas utilizando expresiones regulares. Queremos encontrar un conjunto de posibles colores de raza:
def get_colors(data):
res = re.search('^: (.*)', data).group(1)
return res
Ahora hemos acumulado una cierta cantidad de información de los archivos uno por uno (por ejemplo, carácter, colores, peso). Agreguémoslo al marco de datos de pandas como una nueva línea:
def append_new_row(dataframe, breed, temperament, colors, weight):
return dataframe.append({'': breed,
'': temperament,
'': colors,
'' : weight
}, ignore_index=True)
Lo que tenemos ahora:
Entonces, descargamos el archivo con los datos del sitio, lo desempaquetamos, sacamos los documentos que necesitábamos, extrajimos información importante de ellos y lo pusimos en un formato conveniente. Ahora estos datos se pueden comparar con los proporcionados por la empresa, convertir y analizar, ¡y mucho más! Mucho más conveniente que descargar y escribir manualmente.
def clean_all(path):
os.remove(path + '.zip')
shutil.rmtree(path + '_package')
Es importante que sus acciones sigan siendo completamente legales. Puede tomar datos de sitios, no puede robar contenido. Puede descargar automáticamente, no puede poner el servidor. Estudie los derechos de autor y el Código Penal de la Federación de Rusia, no causan daños.