CodeGym /Cursos /Python SELF ES /Conversión de texto de PDF a formatos CSV o Excel para an...

Conversión de texto de PDF a formatos CSV o Excel para análisis de datos

Python SELF ES
Nivel 44 , Lección 1
Disponible

1. Analizar PDFs

¿Por qué convertir PDF a CSV o Excel?

Antes de entrar a fondo en esta tarea, hablemos de por qué vale la pena hacer estas conversiones. Los documentos PDF se usan en todas partes para compartir información debido a su formato fijo y su facilidad para imprimir.

Sin embargo, cuando se trata de análisis de datos, un PDF no es el mejor amigo del analista. Aquí es donde entran los archivos CSV y Excel. Son fáciles de analizar, se abren fácilmente en Excel o se importan en cualquier herramienta de análisis. Leer, filtrar, ordenar y visualizar datos en estos formatos se hace rápido y fácil. ¿Y quién no querría eso?

Herramientas y librerías

Para completar nuestra tarea, usaremos varias librerías de Python que nos ayudarán a romper la "maldición del PDF" y convertirlo en un maravilloso CSV (o Excel si lo prefieres). Estas son PyPDF2, PDFPlumber y pandas. PyPDF2 nos permitirá extraer texto de un PDF, PDFPlumber hará esto de manera profesional, y pandas manejará los datos como si fueran tablas.

Si aún no has instalado estas librerías, ¿por qué no lo haces ahora mismo? Escribe este comando en el terminal:

Bash
pip install PyPDF2 PDFPlumber pandas

Ahora que está listo, ¡vamos al lío!

2. Extracción de texto de un documento PDF

Extracción de texto con PyPDF2

La primera tarea es extraer el texto valioso de un PDF. Para esto, usaremos la librería PyPDF2. Escribamos un pequeño script que abrirá un archivo PDF y extraerá texto de cada página del documento.

Python

import PyPDF2

# Abrimos el archivo
with open('sample.pdf', 'rb') as file:
    reader = PyPDF2.PdfReader(file)
    text = ""
    
    # Recorremos todas las páginas y extraemos el texto
    for page in reader.pages:
        text += page.extract_text()
    
    print(text)  # Imprimimos el texto extraído

¡Así de fácil! Hemos leído el archivo y extraído su texto. Pero los textos pueden variar: a veces se necesitará procesamiento adicional, como eliminar caracteres innecesarios o dividirlo en líneas.

Extracción de texto con PDFPlumber

PDFPlumber trata mejor los PDF con tablas y estructuras complejas. Con él, es posible extraer texto y también trabajar con tablas.

Python

import pdfplumber

# Abrimos el archivo PDF
with pdfplumber.open("sample_with_table.pdf") as pdf:
    text = ""
    for page in pdf.pages:
        text += page.extract_text() + "\n"

print(text)

Este código también extrae texto de todas las páginas, pero a diferencia de PyPDF2, PDFPlumber maneja mejor la estructura y las tablas.

Extracción de tablas de PDF usando PDFPlumber

Si el PDF contiene tablas, PDFPlumber permite extraerlas en forma de listas, lo que facilita su conversión posterior a CSV o Excel.

Python

import pdfplumber
import pandas as pd

# Abrimos el PDF y extraemos tablas
with pdfplumber.open("sample_with_table.pdf") as pdf:
    all_tables = []
    for page in pdf.pages:
        table = page.extract_table()
        if table:
            all_tables.extend(table)

# Convertimos los datos en un DataFrame
df = pd.DataFrame(all_tables[1:], columns=all_tables[0])  # La primera fila son los encabezados
print(df)

Este código crea una tabla con los datos del PDF y la guarda en un DataFrame, lo que permite fácilmente guardar la tabla en CSV o Excel.

3. Guardar los datos

Conversión de texto a DataFrame

Ahora que tenemos texto, imaginemos que está empaquetado en líneas, cada una de ellas representando una fila de nuestra futura tabla. Nuestra tarea será convertirlo en un DataFrame usando pandas y luego guardarlo como un archivo CSV.

Python

import pandas as pd

# Supongamos que cada línea del texto corresponde a una fila de datos
data = text.split('\n')
data = [row.split(',') for row in data if row.strip() != '']  # Dividimos las líneas por comas

# Creamos un DataFrame
df = pd.DataFrame(data[1:], columns=data[0])  # La primera línea como encabezados

# Guardamos el DataFrame como CSV
df.to_csv('output.csv', index=False)

Aquí simplemente dividimos todo el texto en líneas, luego en elementos separados, y creamos un DataFrame, usando la primera línea como encabezados de columnas. Luego lo guardamos en un archivo CSV. ¡Yuju! Hemos hecho un trabajo que antes requería mucho esfuerzo manual.

Conversión de datos a CSV

Después de extraer texto o tablas de un PDF, puedes guardar los datos en CSV usando la librería Pandas.

Guardar datos en CSV

Python

# Guardar datos en CSV
df.to_csv("output.csv", index=False)
print("Datos guardados exitosamente en output.csv")

Este código guarda el DataFrame con los datos del PDF en el archivo output.csv, que puede abrirse en cualquier editor de hojas de cálculo o cargarse en una plataforma de análisis.

Conversión a Excel

¿Y si prefieres Excel? ¡No hay problema! pandas tiene todo lo que necesitas para esto. Simplemente reemplaza la última línea del ejemplo anterior con:

Python

df.to_excel('output.xlsx', index=False)

De esta forma, tu DataFrame se guardará en un archivo Excel, y podrás desplazarte por él, aplicar todo tipo de filtros y usar tablas dinámicas de Excel — todo lo que te hace el analista del año en la fiesta de la empresa.

Particularidades y trampas

Como siempre, en nuestro camino encontramos obstáculos. A veces, extraer texto de documentos PDF puede parecer tan complicado como explicarle a tu abuelita qué es el almacenamiento en la nube. Algunos PDFs tienen estructuras complejas, como tablas, gráficos e imágenes, que no son fáciles de convertir a texto, especialmente a uno estructurado. En tales casos, podría necesitarse procesamiento adicional del texto, uso de expresiones regulares, o incluso librerías OCR especiales para extraer datos de imágenes contenidas en el PDF.

Además, no todos los documentos PDF son igualmente amigables con la automatización. Algunos están encriptados o protegidos con contraseñas. PyPDF2 permite procesar contraseñas, pero encriptaciones más complejas son otra historia.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION