Нужно найти в docx-файле определенный фрагмент и оставить к нему комментарий? bayoo-docx (форк python-docx) умеет это! В конце статьи в виде бонуса расскажем, как определить номер страницы. 😊 Долгое время в библиотеке python-docx отсутствовала возможность добавления комментариев к word-файлам «из коробки». Созданное еще в 2014 году обсуждение в репозитории python-docx о том, как добавлять комментарии, было довольно активным, но не было найдено решений без прямого вмешательства в xml-разметку. Однако в 2020 году появился форк от python-docx – bayoo-docx, позволяющий добавлять комментарии быстро и легко.  Начнем с установки bayoo-docx: Для сравнения строк будет использоваться thefuzz, о нем можно почитать здесь. Если кратко, то он осуществляет сравнение двух строк и возвращает процент похожести, используя расстояние Левенштейна. Устанавливается следующей командой: Импортируем необходимые модули: ctypes используем для определения текущего полного имени пользователя, что необходимо для более наглядного вида комментария. Желательно, чтобы был пример, с которым можно поиграться (по себе знаю, как тяжело бывает разобраться без реальных примеров).  Давайте создадим такой документ для теста: Объект Document представляет собой весь документ – его структура:•	Список объектов paragraph – абзацы документа     o	Список объектов run – фрагменты текста с различными стилями форматирования (курсив, цвет шрифта и т.п.)•	Список объектов table – таблицы документа    o	Список объектов row – строки таблицы    o	Список объектов cell – ячейки в строке           	Список объектов cell.paragraphs содержит все абзацы в ячейке    o	Список объектов column – столбцы таблицы           	Список объектов cell – ячейки в столбце•	Список объектов InlineShape – иллюстрации документа Вид созданного документа: •	Первая страница •	Вторая страница Напишем функцию, которая будет проходить по списку document.elements (содержит список всех объектов документа) и добавлять в него все объекты paragraph (абзацы), а из таблиц извлекать все объекты paragraph, которые лежат в ячейках. Объекты тестового файла: Список списков с абзацами нужен из-за того, что добавление комментариев к абзацу в тексте и в таблице осуществляется с небольшими различиями и, конечно, чтобы сэкономить строчки кода. Ячейки в таблице устроены таким образом, что могут содержать короткую строку, но из нескольких абзацев, и в каждом абзаце содержатся прогоны (runs), которые нужно склеить и получить полный текст ячейки для осуществления поиска. Функция сбора абзацев из файла: Функция определения полного имени пользователя: И, наконец, основная функция поиска строки и добавления комментария: Загрузим объект тестового файла в переменную document: Строка для поиска: Список абзацев для поиска: Сохраняем полное имя пользователя в переменную name_of_user: Вызываем функцию и передаем аргументы (искомая строка, список абзацев, полное имя пользователя): make_comment(text, paragraphs, name_of_user) Сохраняем изменения в новый файл: document.save('test с комментарием.docx') Появилась копия файла с комментарием: Давайте попробуем найти строчку в таблице: Результат: Комментарий будет сделан к каждому совпадению. Не все функции можно реализовать «из коробки», например, определить номер страницы строки, которую мы нашли, ☹ так легко не получится. В таких случаях на помощь приходят «костыли» 😉. Разрывы страницы бывают двух видов:  1)  hard breaks – разрывы, вставленные с помощью Ctrl + Enter.  2)  soft breaks – разрывы, вставленные, когда автор печатал текст, и произошел автоматический переход на новую страницу.  Обнаружить эти два вида разрыва страницы можно в xml-разметке объектов run (run._element.xml), которые есть у каждого объекта paragraph. Напишем функцию определения номера страницы для искомой строки: Вот здесь XML-разметка объекта run проверяется на наличие тегов, указывающих на наличие разрыва страницы: Как и в прошлый раз, подготавливаем данные для функции: Для нахождения номера страницы нужно передать в функцию number_page первым аргументом строку, которую искали, вторым – список paragraphs. Результатом вывода будут номера страниц через запятую, на которых нашлась строка. Jupyter notebook с подробными комментариями к коду доступен по ссылке. Форк bayoo-docx расширяет возможности python-docx, позволяя вставлять комментарии без особых усилий. К сожалению, функция поиска номеров страниц пока отсутствует, т.к. разрывы страниц генерируются автоматически движком. Все же, немного покопавшись в самой структуре docx, можно реализовать дополнительный функционал вручную.   Профессиональное сообщество