Python docx объединить файлы

(Решено)Объединение нескольких .docx файлов в один используя python-docx.

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.

Lancellot

Новичок

Python 3.
Я пробую объединить файлы .docx файлы используя библиотеку python-docx.
MKA-20-5778-0-1.docx’, ‘MKA-20-5967-0-1.docx — это файлы источники, содержащие контент.
empty.docx — пустой вордовский документ.
Результат объединения сохраняется в combined_word_documents.docx.
В результате работы скрипта сохраняется как пустой файл, а нужно чтобы он содержал контент файлов-источников.

from docx import Document files = ['МКА-20-5778-0-1.docx', 'МКА-20-5967-0-1.docx'] def combine_word_documents(files): combined_document = Document('empty.docx') count, number_of_files = 0, len(files) for file in files: sub_doc = Document(file) # Don't add a page break if you've # reached the last file. if count < number_of_files - 1: sub_doc.add_page_break() for paragraph in sub_doc.paragraphs: text = paragraph.text combined_document.add_paragraph(text) count += 1 combined_document.save('combined_word_documents.docx') combine_word_documents(files)

stud_55

Модератор

Ваш код собирает все параграфы из переданных .docx файлов, записывает их в combined_document и сохраняет в файл. Запустил - код работает.

stud_55

Модератор

Я очень удивился, что код рабочий. И попробовал его прогнать с двумя файлами вордовскими с простой текстовой строкой и действительно работает!
Но почему же мои файлы он не объединяет? Видимо специфический контент. Я могу вам для примера скинуть их?

from docx import Document files = ['d1.docx', 'd2.docx'] def combine_word_documents(files): merged_document = Document() for index, file in enumerate(files): sub_doc = Document(file) if index < len(files) - 1: sub_doc.add_page_break() for element in sub_doc.element.body: merged_document.element.body.append(element) merged_document.save('d3.docx') combine_word_documents(files)

stud_55

Модератор

Вопрос: Я могу каким-то образом сохранить документ в папке 'MergeDocFiles' без задания абсолютного пути типа C:/Users. , а просто указав директорию внутри, откуда был запущен скрипт?

from docx import Document import os files = ['d1.docx', 'd2.docx'] def combine_word_documents(files): merged_document = Document() for index, file in enumerate(files): sub_doc = Document(file) if index < len(files) - 1: sub_doc.add_page_break() for element in sub_doc.element.body: merged_document.element.body.append(element) os.mkdir('MergeDocFiles') merged_document.save('MergeDocFiles/d3.docx') combine_word_documents(files)

stud_55

Модератор

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

Читайте также:  Питон функция суммы элементов

stud_55

Модератор

stud_55

Модератор
# Получаем список всеъ файлов с расширением .docx в текущем каталоге. for filedocx in os.listdir(): if filedocx.endswith(".docx"): print(filedocx) files = filedocx

Здесь выводятся на печать только .docx-файлы, а записывается в переменную files последний файл в папке, так как после завершения цикле в переменной filedocx окажется значение последнего файла в текущей папке. А потом при обработке (так как это не .docx-файл) возникает ошибка.
Нужно обрабатывать только .docx-файлы. Вот исправленный код:

from docx import Document import os files = [] # Получаем список всех файлов с расширением .docx в текущем каталоге. for filedocx in os.listdir(): if filedocx.endswith(".docx"): files.append(filedocx) print(files) def combine_word_documents(files): merged_document = Document() for index, file in enumerate(files): sub_doc = Document(file) if index < len(files) - 1: sub_doc.add_page_break() for element in sub_doc.element.body: merged_document.element.body.append(element) merged_document.save('../НА ПЕЧАТЬ.docx') combine_word_documents(files)

Lancellot

Новичок

Ваш код собирает все параграфы из переданных .docx файлов, записывает их в combined_document и сохраняет в файл. Запустил - код работает.

Я очень удивился, что код рабочий. И попробовал его прогнать с двумя файлами вордовскими с простой текстовой строкой и действительно работает!
Но почему же мои файлы он не объединяет? Видимо специфический контент.

Lancellot

Новичок

Со стилями я разобрался, настроил вордовские файлы таким-образом, чтобы стилей не было и я добился желаемого с вашей помощью.

Ещё момент:
Я при помощи python-docx пытаюсь сохранить документ не в текущую директорию, а в папку 'MergeDocFiles' внутри текущий директории:
doc.save('/MergeDocFiles/' + new_doc_num + ".docx")

В связи чем получаю ошибку: FileNotFoundError: [Errno 2] No such file or directory

Вопрос: Я могу каким-то образом сохранить документ в папке 'MergeDocFiles' без задания абсолютного пути типа C:/Users. , а просто указав директорию внутри, откуда был запущен скрипт?

Lancellot

Новичок

Снова обращусь к вам за помощью. Дело в том, что скрипт на ноуте у меня работал. При запуске на другом компе с теми же самыми библиотеками (но некоторые версии более новые) возникают ошибки.

Сам скрипт (был раньше рабочий):

from docx import Document import os # Получаем список всеъ файлов с расширением .docx в текущем каталоге. for filedocx in os.listdir(): if filedocx.endswith(".docx"): print(filedocx) files = filedocx def combine_word_documents(files): merged_document = Document() for index, file in enumerate(files): sub_doc = Document(file) if index < len(files) - 1: sub_doc.add_page_break() for element in sub_doc.element.body: merged_document.element.body.append(element) merged_document.save('../НА ПЕЧАТЬ.docx') combine_word_documents(files)
Traceback (most recent call last): File "C:/Users/Grumium/PycharmProjects/MailParsing/venv/MergeDocFiles/Merg.py", line 31, in combine_word_documents(files) File "C:/Users/Grumium/PycharmProjects/MailParsing/venv/MergeDocFiles/Merg.py", line 21, in combine_word_documents sub_doc = Document(file) File "C:\Users\Grumium\PycharmProjects\MailParsing\venv\lib\site-packages\docx\api.py", line 25, in Document document_part = Package.open(docx).main_document_part File "C:\Users\Grumium\PycharmProjects\MailParsing\venv\lib\site-packages\docx\opc\package.py", line 128, in open pkg_reader = PackageReader.from_file(pkg_file) File "C:\Users\Grumium\PycharmProjects\MailParsing\venv\lib\site-packages\docx\opc\pkgreader.py", line 32, in from_file phys_reader = PhysPkgReader(pkg_file) File "C:\Users\Grumium\PycharmProjects\MailParsing\venv\lib\site-packages\docx\opc\phys_pkg.py", line 30, in __new__ raise PackageNotFoundError( docx.opc.exceptions.PackageNotFoundError: Package not found at 'o'

Источник

Объединение документов Word с помощью Python

Объединение документов Word в Python

Могут быть различные сценарии, когда вам нужно объединить несколько документов Word в один файл. Например, когда несколько человек пишут разные разделы документа, и вам нужно объединить содержимое в конце. С другой стороны, вам может понадобиться объединить все счета в один документ Word. Чтобы выполнить это слияние программно, в этой статье рассказывается, как объединить несколько документов Word DOCX или DOC в Python.

Библиотека Python для объединения документов Word#

Чтобы объединить файлы DOCX или DOC, мы будем использовать Aspose.Words for Python, мощную библиотеку для создания файлов MS Word и управления ими. Он также позволяет легко разделять, объединять и конвертировать документы Word. Вы можете установить библиотеку из PyPI с помощью следующей команды pip.

Объединение нескольких файлов Word DOCX в Python#

При объединении документов Word вы можете указать форматирование, которое хотите применить к исходному документу. Например, при объединении документа B с документом A вы можете изменить форматирование документа B на A или сохранить исходное форматирование как есть. Ниже приведены шаги для объединения двух документов Word в Python.

  • Загрузите исходный документ Word, используя класс Document.
  • Загрузите целевой документ Word с помощью класса Document.
  • Объедините документы, добавив исходный документ в целевой документ, используя метод Document.appenddocument(Document, aw.ImportFormatMode.KEEPSOURCEFORMATTING).
  • Выберите ImportFormatMode в соответствии с вашими требованиями.
  • Сохраните целевой документ, используя метод Document.save(string).

В следующем примере кода показано, как объединить два файла Word DOCX в Python.

import aspose.words as aw # Load source and destination documents dstDoc = aw.Document("document1.docx") srcDoc = aw.Document("document2.docx") # Append the source document to the destination document. # Pass format mode to retain the original formatting of the source document when importing it. dstDoc.append_document(srcDoc, aw.ImportFormatMode.KEEP_SOURCE_FORMATTING) # Combine Word documents dstDoc.save("combined.docx") 

Исходный документ#

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

исходный текстовый документ для объединения

Целевой документ#

На следующем снимке экрана показан целевой документ Word.

целевой документ Word для объединения

Комбинированный документ#

Ниже приведен снимок экрана после объединения обоих документов Word.

комбинированные текстовые документы в python

Получите бесплатную лицензию API#

Получите временную лицензию для использования Aspose.Words for Python без ограничений на пробную версию.

Вывод#

В этой статье вы узнали, как объединить два документа Word в один документ с помощью Python. Вы можете установить Aspose.Words for Python в свои приложения и интегрировать предоставленный код для объединения документов Word. В дополнение к этому вы можете изучить Aspose.Words для Python, используя документацию. Если у вас возникнут какие-либо вопросы, вы можете задать их нам через наш форум.

Смотрите также#

Источник

Оцените статью