Вероятно, самый безопасный способ открыть (и обрезать) новый файл для записи - использовать режим 'xb'
. 'x'
повысит FileExistsError
, если файл уже существует. 'b'
необходимо, потому что документ word по сути является двоичным файлом: это zip-архив с XML и другими файлами внутри него. Вы не можете сжать и распаковать zip-файл, если преобразуете байты с помощью кодировки символов.
Document.save
принимает потоки, поэтому вы можете передать файл, открытый таким образом, чтобы сохранить документ.
Ваш рабочий процесс может выглядеть примерно так:
doc = docx.Document(...)
...
# Make your document
...
with open('outfile.docx', 'xb') as f:
doc.save(f)
Рекомендуется использовать блоки with
вместо raw open
, чтобы обеспечить правильное закрытие файла даже в случае ошибки.
Точно так же, как вы не можете просто записать файл Word напрямую, вы также не можете добавить его. Способ «добавить» - открыть файл, загрузить объект Document
, а затем записать его обратно, перезаписав исходное содержимое. Поскольку файл word представляет собой zip-архив, весьма вероятно, что добавленный текст даже не будет находиться в конце XML-файла, в котором он находится, а тем более весь файл docx:
doc = docx.Document('file_to_append.docx')
...
# Modify the contents of doc
...
doc.save('file_to_append.docx')
Помните, что библиотека python-docx может не поддерживать загрузку некоторых элементов, что может привести к окончательному удалению при сохранении файла таким способом.