Я пытаюсь создать скрипт для поиска и замены нескольких слов в документе 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()