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.

Bucle a través de carpetas y comparación de archivos usando win32.

Buscando utilizar win32 para comparar múltiples documentos de Word. La convención de nomenclatura es la misma excepto que al nombre del archivo del documento modificado se le agrega test.docx. El código que tengo es el siguiente, pero aparece el error “pywintypes.com_error: (-2147023170, ‘The remote procedure call failed.’, None, None)”. ¿Alguna idea de cómo puedo hacer que esto funcione? Tengo alrededor de 200 documentos para comparar, por lo que parece que Python es la forma de hacerlo.

import win32com.client
from docx import Document
import os

def get_docx_list(dir_path):
    '''
    :param dir_path:
    :return: List of docx files in the current directory
    '''
    file_list = []
    for path,dir,files in os.walk(dir_path):
        for file in files:
            if file.endswith("docx") == True and str(file[0]) != "~":  #Localizar el documento docx y excluir archivos temporales
                file_root = path+"\\"+file
                file_list.append(file_root)
    print("¡El directorio encontró un total de {0} archivos relacionados!".format(len(file_list)))
    return file_list

def main():
    modified_path = r"C:...\Replaced\SWI\"
    original_path = r"C:...\Replaced\SWI original\"

for i, file in enumerate(get_docx_list(modified_path), start=1):
    print(f"{i}、Archivos en progreso:{file}")
    for i, files in enumerate(get_docx_list(original_path), start=1):
        Application = win32com.client.gencache.EnsureDispatch("Word.Application")

        Application.CompareDocuments(
             Application.Documents.Open(modified_path + file),
             Application.Documents.Open(str(original_path) + files))
        Application.ActiveDocument.SaveAs(FileName=modified_path + files + "Comparison.docx")
        Application.Quit()

if __name__ == '__main__':
    main()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el mensaje de error que estás viendo está relacionado con un fallo en la llamada al procedimiento remoto. Sin más información sobre el error específico, es difícil diagnosticar el problema.

    Sin embargo, hay algunas cosas que puedes intentar para que este código funcione:

    1. Asegúrate de que las rutas de archivo son correctas: verifica que las variables modified_path y original_path apunten a los directorios correctos donde se almacenan tus archivos.
    2. Verifica que Microsoft Word esté instalado en tu computadora: el módulo win32com depende de que Microsoft Office esté instalado, así que asegúrate de tener Word instalado en tu computadora y de que esté actualizado.

    3. Intenta usar win32com.client.Dispatch en lugar de win32com.client.gencache.EnsureDispatch: esto a veces puede ayudar a resolver problemas con la llamada al procedimiento remoto fallando.

    4. Intenta usar bloques try/except para capturar cualquier error y proporcionar mensajes de error más informativos: esto puede ayudarte a diagnosticar el problema con mayor facilidad.

    Aquí hay un ejemplo de cómo podrías modificar el código para incorporar estos cambios:

    import win32com.client
    from docx import Document
    import os
    
    def get_docx_list(dir_path):
        '''
        :param dir_path:
        :return: Lista de archivos docx en el directorio actual
        '''
        file_list = []
        for path,dir,files in os.walk(dir_path):
            for file in files:
                if file.endswith("docx") and str(file[0]) != "~":  #Localiza el documento docx y excluye los archivos temporales
                    file_root = os.path.join(path, file)
                    file_list.append(file_root)
        print("¡El directorio encontró un total de {0} archivos relacionados!".format(len(file_list)))
        return file_list
    
    def main():
        modified_path = r"C:\...\Replaced\SWI\\"
        original_path = r"C:\...\Replaced\SWI original\\"
    
        try:
            for i, file in enumerate(get_docx_list(modified_path), start=1):
                print(f"{i}、Archivos en proceso:{file}")
                for i, files in enumerate(get_docx_list(original_path), start=1):
                    try:
                        Application = win32com.client.Dispatch("Word.Application")
                        Application.CompareDocuments(
                             Application.Documents.Open(modified_path + file),
                             Application.Documents.Open(str(original_path) + files))
                        Application.ActiveDocument.SaveAs(FileName=modified_path + files + "Comparacion.docx")
                        Application.Quit()
                    except Exception as e:
                        print(f"Error procesando {files}: {str(e)}")
                        continue
        except Exception as e:
            print(f"Error procesando {file}: {str(e)}")
            return
    
    if __name__ == '__main__':
        main()
    

    Estos cambios podrían ayudarte a identificar el problema específico con tu código y hacer que funcione como se espera.

Comments are closed.