Замена текста в ворд python

Обновлено: 06.07.2024

Довольно часто при разработке возникает необходимость программно создать какой-то документ или внести изменения в уже существующий. Работая с текстами разной направленности из кода, нужно принять во внимание, что тексты иногда хранятся в более сложных форматах, чем .txt . Они могут содержать встроенное форматирование, быть разделенными на страницы, перемежаться медиаконтентом (графиками, рисунками).

Python умеет работать со многими такими документами. Давайте посмотрим, что можно сделать, чтобы создавать документы в формате Word, Excel или PowerPoint прямо из Python.

Стоит отметить, что форматы . docx , . xlsx и . pptx открытые, что позволяет разработчикам довольно просто писать библиотеки для работы с ними. Для каждого офисного формата есть несколько библиотек с разным функционалом, и мы рассмотрим лишь некоторые из них.

2. Создание текстового документа

Давайте воспользуемся модулем python-docx для создания docx -документа. Он, как и остальные приведенные в данном уроке библиотеки, не входит в состав стандартной библиотеки и требует отдельной установки через

После установки давайте рассмотрим вот такой пример:

Ключевой элемент этой библиотеки — объект Document . Для создания нового документа формата . docx надо записать результат вызова Document в переменную. Этого достаточно для создания абсолютно пустого документа в памяти. Чтобы наполнить его содержимым, необходимо вызывать у получившегося объекта различные методы, например:

  • add_heading — для создания заголовков разного уровня. При этом уровень 0 — заголовок документа
  • add_paragraph — для создания абзацев. С помощью параметра style можно управлять стилем абзаца и превращать его элемент маркированного или нумерованного списка

Метод add_paragraph объекта-документа возвращает новый абзац, у которого есть свои методы вроде add_run , который дописывает текст с форматированием или без него в конец абзаца.

Метод add_table создает в документе таблицу размером col столбцов и row строк. Если мы присвоим результат вызова этой функции переменной, сможем заполнить такую таблицу данными.

Метод save сохраняет документ под указанным именем.

Выполните приведенный код. Затем откройте созданный файл test.docx. Вы должны увидеть что-то такое:

С помощью python-docx можно не только создавать новые документы, но и открывать уже существующие. Для этого при создании документа надо в качестве параметра передать путь к файлу или просто его имя, если он находится в каталоге с программой.

Таким образом, мы можем получить абзацы или другие элементы документа, пройтись по ним и получить либо изменить какую-то информацию:

Как мы увидим дальше, работа с подобными модулями примерно одинакова. Все элементы управления и форматирования:

есть в наличии в том или ином виде, их можно изменять и комбинировать.

3. Работа с документом как с шаблоном

Очень распространенным вариантом использования является не создание документа с нуля, а заполнение данными уже готового шаблона. Для этого можно использовать библиотеку docxtpl .

Например, у нас есть вот такой шаблон приглашения на мероприятие:

C помощью двойных фигурных скобок выделены места в документе, куда мы можем подставить свои данные по имени. Кроме того, шаблоны поддерживают специальный синтаксис для циклов, условий и других конструкций. Внутри docxtpl лежит мощный и простой в использовании движок шаблонов jinja2.

При работе с этой библиотекой нам надо воспользоваться классом DocxTemplate, при создании экземпляра которого необходимо передать имя нашего документа, который содержит шаблон.

После чего нужно создать словарь и заполнить его информацией для вставки в документ. Значения из нашего словаря будут подставляться в шаблон по ключу. Метод render как раз и отвечает за такое заполнение. Метод save сохраняет документ под переданным именем.

В итоге у нас получится вот такой документ:

4. Создание презентаций

Для работы с презентациями формата .pptx в Python есть библиотека python-pptx.

Принцип ее работы во многом схож с библиотекой python-docx, но здесь ключевым элементом, с которым идет работа, выступает не Document, а Presentation.

Напишем следующий код:

Обратиться к слайдам презентации можно через атрибут slides презентации. В свою очередь у slides есть метод add_slide, который добавляет новый слайд в презентацию. Данный метод принимает на вход схему нового слайда.

Подробнее о схемах слайдов смотрите в документации. Но, например, нулевая схема предназначена для создания заголовочного слайда, а восьмая — для слайда с изображением.

На слайде, в зависимости от схемы, по которой он создан, могут быть разные контейнеры для содержимого, которые называются placeholders . Бывают контейнеры для текста, изображения, таблицы или графика. У текстового контейнера SlidePlaceholder есть свойство text, которое задает текст.

У контейнера для изображения PicturePlaceholder есть метод insert_picture , который добавляет переданное изображение на слайд.

Метод save презентации сохраняет презентацию под переданным именем.

Вот такая презентация у нас получится в итоге:

Как и в случае с документами, мы можем открыть уже существующую презентацию и получить или изменить какие-либо данные.

5. Создание таблиц Excel

Для работы с файлами формата .xlsx есть несколько библиотек, одна из них — xlsxwriter , предназначенная только для создания xlsx-файлов.

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

Потом с помощью метода add_worksheet надо добавить страницу в документ. У добавленной страницы можно вызывать метод write , который записывает в определенную строку и колонку переданные данные.

С помощью метода add_chart можно создать диаграмму, указав ее тип и данные для построения. После чего построенную диаграмму можно добавить на страницу с помощью метода insert_chart с указанием ячейки вставки и самой диаграммы.

Исполняем обязанности по получению сведений о своих бенефициарных владельцах

Небольшая вводная

Начиная с 21 декабря 2016 года вступили изменения в ФЗ РФ «О противодействии легализации (отмыванию) доходов, полученных преступным путем, и финансированию терроризма», касательно обязанности юридического лица по раскрытию информации о своих бенефициарных владельцах. В связи с этим, многие компании направляют запросы по цепочке владения с целью выяснения своих бенефициарных владельцев. Кто-то формирует запросы на бумаге, кто-то рассылает электронные письма.

На наш взгляд, надлежащим доказательством исполнения обязанности «знай своего бенефициарного владельца» является наличие письма на бумаге с отметкой об отправке/вручении. Данные письма в идеале должны готовиться не реже одного раза в год. Если в ведении юриста находится всего несколько компаний, то составление писем не составляет особого труда. Но, если компаний больше 3-х десятков, составление писем превращается в уничтожающую позитив рутину. Дело усугубляется тем, что реквизиты писем постоянно меняются: подписанты увольняются, компании перерегистрируются, меняя адреса. Все это надо учитывать. Как здесь могут помочь навыки программирования на python?

Очень просто — хорошо бы иметь программу, которая сама будет подставлять в письма необходимые реквизиты. В том числе формировать сами письма, не заставляя создавать документ за документом вручную. Попробуем.

Структура письма в word. Модуль python docxtpl

Перед написанием кода программы посмотрим как должен выглядеть шаблон письма, в который мы будем помещать наши данные.

Текст письма от общества своему участнику/акционеру будет примерно следующим:


Напишем простую программу, которая заполнит для начала одно поле в нашем шаблоне, чтобы понять принцип работы.

Для начала в самом шаблоне письма Word вместо одного из полей, например, подписанта поставим переменную. Данная переменная должна быть на либо на англ. языке, либо на русском, но в одно слово.Также переменная должна быть обязательно заключена в двойные фигурные скобки. Выглядеть это будет примерно так:


Сама программа будет иметь следующий вид:


Вначале мы импортируем модуль для работы с документами формата Word. Далее мы открываем шаблон, и в поле директор, которое бы обозначили ранее в самом шаблоне, вносим ФИО директора. В конце документ сохраняется под новым именем.

Таким образом, чтобы заполнить все поля в файле-шаблоне Word нам для начала необходимо определить все поля ввода в самом шаблоне скобками <> вместе с переменными и потом написать программу. Код будет примерно следующим:


На выходе при исполнении программы мы получим готовый заполненный документ.

Пакетная замена текста в нескольких файлах Word с помощью Python

В примере 7 мы сгенерировали контракты на закупку партиями. Но предположим, что теперь название нашей компании изменено с «ABC Trading Co., Ltd.» на «ABC Trading Co., Ltd.», тогда нам нужно перейти к соответствующей позиции в каждом контракте, чтобы заменить ее. Конечно, вы также можете изменить исходный шаблон, а затем заново создать контракт. Вот как использовать Python для замены текста в нескольких файлах Word партиями, то есть заменять «коммерция» на «торговля».



Давайте сначала зайдем в файл Word и узнаем, сколько раз встречается слово «бизнес». Как вы можете видеть на картинке ниже, мне повезло: он появился только дважды, один раз в абзаце текста, а второй в таблице в конце, и все они были заменены.


Мы напрямую заимствуем функцию, определенную в примере 7, для замены текста выше info_update . Вам нужно только указать путь к целевому файлу, слово, которое нужно заменить, и новое слово. Затем импортируйте os Библиотека, получите целевой файл и путь к нему, как показано ниже.

После этого можно начинать операцию пакетной замены. Вы можете проверить результаты в папке «Результаты замены».

Но что, если слово «коммерция» встречается один или несколько раз в другом месте и не может быть заменено? Также есть способы указать диапазон заменяемых абзацев. Например, мы намеренно вставили 4 слова «бизнес» в середину «special_ contains noise words.docx». Таким образом, у нас в документе 6 «бизнес».


Предположим, мы хотим заменить первую, третью и шестую «коммерцию» на «торговлю», тогда мы должны сначала определить, в каком абзаце они находятся, то есть соответствующий paragraph индекс чего-либо. Поскольку шестое «дело» находится в таблице, а не в абзаце, нам нужно найти только первый и третий абзацы.

Выше мы все еще используем docx Модуль для чтения файла целевого слова. Нам нужно знать абзац, содержащий слово «бизнес», нам нужно знать его индекс. Но я docx Функция, связанная с индексом, не найдена в модуле, поэтому здесь используется обходной путь. Создать пустой список text , А затем извлеките и сохраните текст, соответствующий всем абзацам в текстовом документе, в этот список. Список может использовать функцию индекса, а индекс элемента в списке соответствует индексу абзаца. Так что просто найдите в списке слово "бизнес" text В указателе вы можете найти его в абзаце paragraph Индекс в. от len(text) Всего 77 абзацев.

Затем создайте пустой список target_index , Используется для хранения строк, содержащих слово "коммерция" в списке. text Индекс в. использовать for Прокрутите список text Все элементы через if В предложении определяется, содержит ли он «деловой» символ, и, если он содержит, индекс, соответствующий этому элементу. text.index(i) Сохранить в список target_index . По результатам видно, что есть пять строк, содержащих слово «бизнес» с индексами 15, 26, 32, 38 и 66.

Чтобы проверить точность, мы можем распечатать, чтобы увидеть, действительно ли абзац, соответствующий соответствующему индексу, содержит слово «бизнес». Следующие напечатанные результаты показывают, что результаты идеальны.

Потому что мы заменяем только первую, третью и шестую «коммерцию» на «торговлю», а шестой находится в таблице. Поэтому вам нужно изменить исходную функцию замены info_update , Назвал новую функцию info_update_new , Мы указываем в функции замену только целевых слов в параграфах 15 и 32, и продолжаем замену целевых слов в таблице.

Вызов новой функции замены info_update_new , И сохраняем результат в папку «данные / результат замены».
Результат выглядит следующим образом. Видно, что в файле после замены есть три слова «бизнес» и «торговля», и были заменены только слова в обозначенных позициях.


Весь исходный код и инструкции заполнены в блокноте Jupyter, используемая информация Excel была загружена на GitHub, добро пожаловать в Fork или загрузите на локальный компьютер для игры. . .

модуль oodocx, упомянутый на той же странице, ссылается на папку /examples, которой, похоже, там нет.
Я прочитал документацию python-docx 0.7.2, плюс все, что я мог найти в Stackoverflow по этому вопросу, поэтому, пожалуйста, поверьте, что я сделал свою "домашнюю работу".

Python-единственный язык, который я знаю (начинающий+, возможно, промежуточный), поэтому, пожалуйста, не предполагайте никаких знаний о C, Unix, xml и т. д.

задача: откройте ms-word 2007+ документ с одной строкой текста в нем (чтобы все было просто) и заменить любое "ключевое" слово в словаре, которое встречается в этой строке текста, его словарным значением. Затем закройте документ, сохраняя все остальное таким же.

строка текста (например) " мы задержимся в морских покоях."

Я не вижу ничего в документации, которая позволяет мне это сделать-может быть, это есть, но я не понимаю, потому что все не прописано на моем уровень.

Я следил за другими предложениями на этом сайте и пытался использовать более ранние версии модуля (https://github.com/mikemaccana/python-docx), который должен иметь "методы, такие как replace, advReplace" следующим образом: я открываю исходный код в интерпретаторе python и добавляю следующее В конце (это во избежание столкновений с уже установленной версией 0.7.2):

NameError: имя 'coreprops' не определено

Если это имеет значение, я использую 64-битную версию Canopy Enthought на OSX 10.9.3

у нескольких людей был успех, хотя, делая то, что им нужно, используя средства, уже присутствующие. Вот пример. Это не имеет ничего общего с разделами кстати :)

для поиска в таблицах также, вам нужно будет использовать что-то вроде:

если вы продолжите этот путь, вы, вероятно, довольно быстро обнаружите, какие сложности. Если вы замените весь текст абзаца, это удалит любое форматирование на уровне символов, например слово или фразу жирным шрифтом или курсивом.

кстати, код из ответа @wnnmaw предназначен для устаревшей версии python-docx и не будет работать вообще с версиями после 0.3.0.

мне нужно было что-то заменить регулярные выражения в docx. Я принял ответ скэнниса. Для обработки стиля я использовал ответ от: Python docx заменяет строку в абзаце, сохраняя при этом стиль добавлен рекурсивный вызов для обработки вложенных таблиц. и придумал что-то вроде этого:--5-->

для перебора по словарю:

обратите внимание, что это решение заменит регулярное выражение, только если все регулярное выражение имеет одинаковый стиль в документе.

также, если текст отредактированный после сохранения того же стиля текст может быть в отдельных запусках. Например, если вы открываете документ, который имеет строку" testabcd", и вы меняете его на" test1abcd "и сохраняете, даже тесто в том же стиле есть 3 отдельных запуска" test"," 1 "и" abcd", в этом случае замена test1 не будет работать.

Это для отслеживания изменений в документе. Чтобы Мардж это один раз, в Word вам нужно перейти в "Параметры", "Центр доверия " и в" параметры конфиденциальности "unthick" хранить случайные числа для улучшения объединить точность " и сохранить документ.

проблема со второй попыткой заключается в том, что вы не определили параметры, которые savedocx потребности. Вам нужно сделать что-то вроде этого до вы экономите:

Читайте также: