Повышение производительности win32com во время поиска и замены документа Word - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь создать скрипт для поиска и замены нескольких слов в документе Word, win32com работает очень хорошо для этого, но он довольно медленный, и с более чем 10 терминами это может занять несколько минут. Этот скрипт занимает ~ 5 минут до окончания sh, и в слове документа есть 1 вхождение каждого термина.

import win32com.client as win32

term_list = ['Item0', 'Item1', 'Item2', 'Item3', 'Item4', 'Item4', 'Item5', 'Item6', 'Item7', 'Item8', 'Item9']

path_docx = r'C:\Temp\Document.docx'

word = win32.gencache.EnsureDispatch('Word.Application')

const = win32.constants
word.Visible = True
doc = word.Documents.Open(path_docx)

for paragraph in doc.Paragraphs:
    #print(paragraph)
    for item in term_list:
        paragraph.Range.Find.Execute(FindText=item, ReplaceWith="Replaced", Replace=const.wdReplaceAll)

doc.SaveAs(r'C:\Temp\Document_replaced.docx')

Что я могу сделать, чтобы улучшить свой код?

Я также знаю, что python -docx существует, но я предпочитаю использовать само Word для поиска и замены, если это возможно.

Редактировать :

Поскольку @tst предложил установить word.Visible = False, это немного помогло, но мой код также делал много вызовов COM, и это снижало производительность. Этот новый код действительно быстрый. Он тоже хорошо масштабируется, я могу пролистать список из 500 терминов за 5 секунд.

import win32com.client as win32

term_list = ['Item0', 'Item1', 'Item2', 'Item3', 'Item4', 'Item4', 'Item5', 'Item6', 'Item7', 'Item8', 'Item9']

path_docx = r'C:\Temp\Document.docx'
word = win32.gencache.EnsureDispatch('Word.Application')

const = win32.constants
word.Visible = False
doc = word.Documents.Open(path_docx)

for items in term_list:
    findObject = word.Selection.Find
    findObject.ClearFormatting()
    findObject.Text = items
    findObject.Replacement.ClearFormatting()
    findObject.Replacement.Text = "FOUND"
    findObject.Execute(Replace=win32.constants.wdReplaceAll)

doc.Save()
doc.Close()
...