es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo extraer una tabla de Word de varios archivos usando python docx.

Estoy trabajando en un proyecto en el trabajo donde necesito analizar más de mil archivos de MS-Word, cada uno consistente en la misma tabla. De cada tabla solo necesito extraer algunas celdas y convertirlas en una fila, que más tarde se concatenarán para crear un dataframe para un análisis adicional.

Probé la biblioteca docx de Python en un archivo y logró leer la tabla. Sin embargo, después de utilizar la misma función dentro de un bucle for que comienza creando una variable con todos los nombres de archivo y luego pasando eso a la función Document, el resultado es solo una tabla, que es la primera tabla de la lista de archivos.

Tengo la sensación de que no estoy abordando esto de la manera correcta, agradecería cualquier orientación al respecto, ya que en este momento estoy completamente perdido.

A continuación se muestra el código que utilicé, que consiste principalmente en código que encontré en stackoverflow:

import os
import pandas as pd
file = [f for f in os.listdir() if f.endswith(".docx")]

for name in file:
    document = Document(name)
    table = document.tables[0]
    data = []

    keys = None
    for i, row in enumerate(table.rows):
        text = (cell.text for cell in row.cells)

        # Establecer el mapeo basado en la primera fila
        # de encabezados; estos se convertirán en las claves de nuestro diccionario
        if i == 0:
            keys = tuple(text)
            continue

        # Construir un diccionario para esta fila, mapeando
        # claves a valores para esta fila
        row_data = dict(zip(keys, text))
        data.append(row_data)

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Estimado experto en TI,

    Según su descripción, parece que está en el camino correcto al usar la biblioteca python-docx para extraer la información necesaria de varios archivos de MS-Word. El problema que enfrenta es que el bucle que ha creado solo devuelve la primera tabla de cada archivo en lugar de todas ellas.

    Para resolver este problema, una forma en la que podría modificar su código es creando una lista vacía para almacenar los marcos de datos que desea concatenar posteriormente. Luego, dentro del bucle, puede utilizar la biblioteca Pandas para convertir los datos en un marco de datos y añadirlo a la lista. Por último, puede concatenar todos los marcos de datos de la lista utilizando la función pd.concat().

    Aquí tienes un ejemplo de cómo podrías modificar tu código:

    import os
    import pandas as pd
    from docx import Document
    
    # crea una lista vacía para almacenar los marcos de datos
    dfs = []
    
    # obtén la lista de todos los archivos docx en el directorio
    files = [f for f in os.listdir() if f.endswith(".docx")]
    
    # recorre todos los archivos docx
    for file in files:
        # crea un objeto de documento utilizando la biblioteca python-docx
        doc = Document(file)
        table = doc.tables[0]
    
        # crea una lista vacía para almacenar los datos de la tabla
        data = []
        keys = None
    
        # recorre todas las filas de la tabla
        for i, row in enumerate(table.rows):
            text = [cell.text for cell in row.cells]
    
            # utiliza la primera fila como encabezados de columna
            if i == 0:
                keys = text
                continue
    
            # añade los datos de la fila a la lista de datos
            data.append(text)
    
        # convierte la lista de datos en un marco de datos de pandas y añádelo a la lista dfs
        df = pd.DataFrame(data, columns=keys)
        dfs.append(df)
    
    # concatena todos los marcos de datos en la lista dfs
    result = pd.concat(dfs, ignore_index=True)
    
    # realiza un análisis adicional en el marco de datos resultante
    

    Este código debería crear una lista de marcos de datos, donde cada marco de datos representa la tabla en un solo documento. Luego, al concatenar todos los marcos de datos, se creará un solo marco de datos que contiene toda la información que necesita.

    Espero que esto sea de ayuda. Avíseme si tiene alguna pregunta adicional.

    Saludos cordiales,
    [Su nombre]

Comments are closed.