miércoles, 6 de mayo de 2026

DATOS. Archivos de texto

Archivos .odt

Acceso a tablas y textos

Aunque no aporte mucho a lo que ya sabemos, no podemos dejar de exponer los procedimientos que nos permiten acceder al contenido de los archivos .odt, dada la frecuencia con la que trabajamos con estos archivos en este blog. Así vamos a replicar aquí lo que ya hicimos en esta entrada con los archivos .docx.



import os
import sys
import io
from odf import text, table, teletype
from odf.opendocument import load

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# --- Función ----

def leer_contenido_odt(ruta_archivo):
    if not os.path.exists(ruta_archivo):				    # Controla que existe el archivo
        print(f"Error: El archivo '{ruta_archivo}' no existe.")
        return

    try:
        doc = load(ruta_archivo)				    		# Cargar el documento ODT
    except Exception as e:
        print(f"Error al cargar el archivo: {e}")
        return
    
    print(f"--- INICIO DEL CONTENIDO: {ruta_archivo} ---\n")

    contenido_principal = doc.text				 		 # Accedemos al texto

    for elemento in contenido_principal.childNodes:
        
        if elemento.tagName in ["text:p", "text:h"]:		# 1. Párrafos y Encabezados (h = heading, p = paragraph)
            texto = teletype.extractText(elemento).strip()
            if texto:
                etiqueta = "TÍTULO" if elemento.tagName == "text:h" else "PÁRRAFO"  # Diferenciamos si es título o párrafo
                print(f"[{etiqueta}]: {texto}")
        elif elemento.tagName == "table:table":				# 2. Tablas
            filas = elemento.getElementsByType(table.TableRow)
            nombre_tabla = elemento.getAttribute("name") or "Tabla"
            
            print(f"\n[--- INICIO {nombre_tabla} ---]")
            for fila in filas:
                celdas = fila.getElementsByType(table.TableCell)					# Extraemos el texto de cada celda
                contenido_fila = [teletype.extractText(celda).strip() for celda in celdas]
                if any(contenido_fila):												# Solo imprimimos la fila si tiene algún contenido
                    print(" | ".join(contenido_fila))
            print(f"[--- FIN {nombre_tabla} ---]\n")

    print(f"\n--- FIN DEL DOCUMENTO ---")

# --- Llamada a función ---

if __name__ == "__main__":
    nombre_archivo = r"ruta_de_mi_archivo.odt"  # Aquí el nombre del archivo .odt
    leer_contenido_odt(nombre_archivo)			# Llamada a la función


Ahora toca identificar sólo las tablas...


  
import os
import sys
import io
from odf import table, teletype
from odf.opendocument import load

# Configuración para que la consola de Windows maneje correctamente caracteres especiales
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# --- Función de extracción de tablas ---

def extraer_tablas_odt(ruta_archivo):

    if not os.path.exists(ruta_archivo):							# Nombre del archivo a procesar
        print(f"Error: El archivo '{ruta_archivo}' no existe.")
        return
    
    try:															# Cargar el documento ODT
        doc = load(ruta_archivo)
    except Exception as e:
        print(f"Error al cargar el archivo: {e}")
        return
    
    print(f"--- EXTRACCIÓN DE TABLAS: {ruta_archivo} ---\n")

    # Buscamos todas las tablas en el documento mediante getElementsByType()
    tablas = doc.getElementsByType(table.Table)

    if not tablas:
        print("No se encontraron tablas en el documento.")
        return

    for i, t in enumerate(tablas):
        nombre_tabla = t.getAttribute("name") or f"Tabla {i+1}"
        print(f"[--- INICIO {nombre_tabla} ---]")
        
        filas = t.getElementsByType(table.TableRow)
        for fila in filas:
            celdas = fila.getElementsByType(table.TableCell)
            
            contenido_fila = [teletype.extractText(celda).strip() for celda in celdas]	# Extraemos el texto de cada celda
            
            if any(contenido_fila):														# Imprimimos la fila solo si contiene algún texto
                print(" | ".join(contenido_fila))
        
        print(f"[--- FIN {nombre_tabla} ---]\n")

    print(f"--- FINALIZADO ---")
    
# --- Llamada a la función ---

if __name__ == "__main__":
    nombre_archivo = r"ruta_de_mi_archivo.odt" 	# Aquí la ruta del archivo
    extraer_tablas_odt(nombre_archivo)			# Llamada a la función
    

Para finalizar vamos a mostrar el script que únicamente accede a los párrafos del documento, omitiendo el contenido de las tablas y de tablas-formulario.



import os
import sys
import io
from odf import text, teletype
from odf.opendocument import load

# Configuración para que la consola de Windows maneje correctamente caracteres especiales
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# --- Función de extracción de texto (párrafos) ---

def leer_solo_parrafos_odt(ruta_archivo):
  
    if not os.path.exists(ruta_archivo):							 # Verificar si el archivo existe
        print(f"Error: El archivo '{ruta_archivo}' no existe.")
        return

    try:
        doc = load(ruta_archivo)									# Cargar el documento ODT
    except Exception as e:
        print(f"Error al cargar el archivo: {e}")
        return
    
    print(f"--- CONTENIDO TEXTUAL (SIN TABLAS): {ruta_archivo} ---\n")

    contenido_principal = doc.text									# Accedemos al elemento de texto del cuerpo

    for elemento in contenido_principal.childNodes:					# Iteramos sobre los elementos del cuerpo
        
        if elemento.tagName in ["text:p", "text:h"]:				# Filtramos: Solo nos interesan párrafos (p) y encabezados (h)
            texto = teletype.extractText(elemento).strip()
            
            if texto:												# Solo imprimimos si el párrafo no está vacío
                # Opcional: puedes quitar la etiqueta [PÁRRAFO] si quieres el texto limpio
                etiqueta = "TÍTULO" if elemento.tagName == "text:h" else "PÁRRAFO"
                print(f"[{etiqueta}]: {texto}")

    print(f"\n--- FIN DEL DOCUMENTO ---")

# --- Llamada a la función ---

if __name__ == "__main__":
    nombre_archivo = r"ruta_de_mi_archivo.odt" 		# Aquí la ruta del archivo a trabajar 
    leer_solo_parrafos_odt(nombre_archivo)			# Llamada a la función


No hay comentarios:

Publicar un comentario

Comenta esta entrada