Python-docx模块不会覆盖相同的文件名

时间:2019-05-28 15:04:51

标签: python python-docx

我一直在使用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 :(得分: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')

答案 1 :(得分:0)

document.save(filename)将覆盖filename(如果存在)。

您的代码未显示document的来源,但是以下内容足以重现此行为:

Document().save(filename)

我建议您使用文字(例如“ Client Invoice.docx”)进行此操作,这样可以消除可能的原因。

如果仍然存在问题,我将查看权限,例如运行Python的用户能够读取和写入文件,尽管我认为这会引发异常。另一要检查的是文件是否正在被写入另一个目录。 Python程序的默认目录有时不是预期的目录。

您应该研究本文档,以帮助您完善可复制的问题陈述。通常,遵循此过程可以帮助您了解哪里出了问题,但无论如何,它可以为我们提供更多需要帮助的内容:
https://stackoverflow.com/help/minimal-reproducible-example