Как я могу создать документ Word (.docx), если он не найден с использованием Python, и написать в нем? - PullRequest
0 голосов
/ 16 января 2019

Как я могу создать документ Word (.docx), если он не найден с использованием python, и написать в нем?

Я, конечно, не могу выполнить одно из следующих действий:

file = open(file_name, 'r')
file = open(file_name, 'w')

или, чтобы создать или добавить, если найдено:

f = open(file_name, 'a+')

Также я не могу найти никакой связанной информации в документации по python-docx по адресу:

https://python -docx.readthedocs.io / ен / последний /

Примечание:

Мне нужно создать автоматический отчет через python с текстовыми и круговыми диаграммами, графиками и т. Д.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Похоже, я нашел ответ:

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

import os
from docx import Document 

#checking if file already present and creating it if not present
if not os.path.isfile(r"file_path"):

    #Creating a  blank document
    document = Document()

    #saving the blank document
    document.save('file_name.docx')

#------------editing the file_name.docx now------------------------

#opening the existing document
document = Document('file_name.docx')

#editing it
document.add_heading("hello world" , 0)

#saving document in the end
document.save('file_name.docx')

Дальнейшие изменения / предложения приветствуются.

0 голосов
/ 16 января 2019

Вероятно, самый безопасный способ открыть (и обрезать) новый файл для записи - использовать режим '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 может не поддерживать загрузку некоторых элементов, что может привести к окончательному удалению при сохранении файла таким способом.

...