Перебирание папок и сравнение файлов с помощью win32

#python #winapi #ms-word #docx

Вопрос:

Хотите использовать win32 для сравнения нескольких документов word. Соглашение об именовании такое же, за исключением того, что в измененном документе есть test.docx добавлено в имя файла. Ниже приведен код, который у меня есть, но он содержит «pywintypes.com_error: (-2147023170,» Сбой удаленного вызова процедуры.», Нет, нет)». Есть какие-нибудь идеи о том, как я могу заставить это работать? У меня есть около 200 доков для сравнения, так что python, похоже, подходит для этого.

 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]) != "~": #Locate the docx document and exclude temporary files  file_root = path "\" file  file_list.append(file_root)  print("The directory found a total of {0} related files!".format(len(file_list)))  return file_list   def main():  modified_path = r"C:...ReplacedSWI\"  original_path = r"C:...ReplacedSWI original\"   for i, file in enumerate(get_docx_list(modified_path), start=1):  print(f"{i}、Files in progress:{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()    

Ответ №1:

Для тех, кто ищет решение для массового сравнения слов, ниже приведен код, который я успешно прогнал через несколько сотен документов. Удалите инструкции печати, как только вы отсортируете соглашение об именах.

 import win32com.client import os  def main():  #path directories  modified_path = r"C:UsersAdminDesktopReplacedSOP- Plant and Equipment\"  original_path = r"C:UsersAdminDesktopReplacedSOP - Plant and Equipment Original\"  save_path = r"C:UsersAdminDesktopReplacedTEST\"  file_list1 = os.listdir(r"C:UsersAdminDesktopReplacedSOP- Plant and Equipment\")  file_list2 = os.listdir(r"C:UsersAdminDesktopReplacedSOP - Plant and Equipment Original\")  #text counter  Number = 0    #loop through files and compare  for file in file_list1:  for files in file_list2:  #if files match do comparision, naming convention to be changed  if files[:-5]   " test.docx" == file:  Number  = 1  print(f"The program has completed {Number} of a total of {len(file_list1)} related files!")  try:  Application = win32com.client.gencache.EnsureDispatch("Word.Application")  Application.CompareDocuments(  Application.Documents.Open(modified_path   file),  Application.Documents.Open(str(original_path)   files))  Application.ActiveDocument.ActiveWindow.View.Type = 3  Application.ActiveDocument.SaveAs(FileName=save_path   files[:-5]   " Comparison.docx")   except:  Application.Quit()  pass       if __name__ == '__main__':  main()     

Комментарии:

1. Как минимум, в ответе должно быть объяснено, в чем заключается проблема и как предлагаемое решение решает ее. Ответы типа «Попробуй это» обычно бесполезны.