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