Модуль Python-docx не перезаписывает одно и то же имя файла - PullRequest
0 голосов
/ 28 мая 2019

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

Я пытался выполнить os.remove или удалить файл перед повторным запуском программы, но ничего не получилось.

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

def writeDocx():
    # os.remove(client+' Invoice.docx')
    ###heading at top###
    document.add_heading(client+" Invoice", 0)
    document.add_paragraph("").add_run("This Invoice was generated automatically").italic = True
    table = document.add_table(rows=1, cols=3)
    t = table.rows[0].cells
    t[0].text = 'TEST'
    t[1].text = 'TEST'
    t[2].text = 'TEST'
    for i in range(6):
        row_cells = table.add_row().cells
        row_cells[0].text = str(i)
        row_cells[1].text = str(i)
        row_cells[2].text = str(i)
    document.save(client+' Invoice.docx')

Он должен перезаписать уже сохраненный файл Invoice.docx вновь созданным файлом, но это не так.

Не показывает сообщений об ошибках.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

document.save(filename) перезапишет filename, если он существует.

Ваш код не показывает, откуда взято document, но следующего должно быть достаточно для воспроизведения поведения:

Document().save(filename)

Я предлагаю вам сделать это с литералом, таким как "Client Invoice.docx", который исключает формирование имени из возможных причин.

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

Вам следует изучить этот документ, чтобы помочь в уточнении воспроизводимой формулировки проблемы. Часто выполнение этого процесса помогает вам понять, в чем вы ошиблись, но в любом случае дает нам больше информации о том, что нам нужно сделать, чтобы помочь вам:
https://stackoverflow.com/help/minimal-reproducible-example

0 голосов

Из официальной документации Python-Docx

Функция document.save("file.docx") не заменит существующий файл, пока он не будет открыт как объект документа (document = Document("file.docx"))

Но если вы хотите обойти это, вы можете сделать что-то вроде этого

is_present = False
document = Document()
try:
  document = Document("Invoice.docx")
  is_present =True
except:
  pass

if is_present:
  document.save("old-Invoice.docx") # or you can delete it.
  document = Document()
document.add_heading("Invoice", 0)
document.add_paragraph("").add_run("This Invoice was generated automatically").italic = True
table = document.add_table(rows=1, cols=3)
t = table.rows[0].cells
t[0].text = 'TEST1'
t[1].text = 'TEST2'
t[2].text = 'TEST3'
for i in range(6):
    row_cells = table.add_row().cells
    row_cells[0].text = str(i)
    row_cells[1].text = str(i)
    row_cells[2].text = str(i)
document.save('Invoice.docx')
...