xl使用上下文管理器打开工作簿,并在进行更改后覆盖它



我要做的是打开csv文件,在里面做更改并保存它。我的代码是这样的:

savePath = r'D:file.csv'
with xw.App(visible=True) as app:
wb = app.books.open(savePath)
sheet1 = wb.sheets[0]
saveDF = sheet1.range(wb.sheets[0].used_range.address).options(pd.DataFrame, chunksize=30_000, index=False).value
wb.sheets[0].clear()
wb.sheets[0].range('A1').options(index=False, header=True).value = saveDF
wb.api.SaveAs(savePath, FileFormat=FileFormat.xlCSV)

这段代码有点工作,但当它保存文件时,它问我是否要覆盖文件,因为它已经存在。

我所做的就是将它保存为"csv。txt"文件,然后删除".csv"文件和重命名".csv.txt"文件返回到".csv"文件使用下面的代码:

savePath = r'D:file.csv'
with xw.App(visible=True) as app:
wb = app.books.open(savePath)
sheet1 = wb.sheets[0]
saveDF = sheet1.range(wb.sheets[0].used_range.address).options(pd.DataFrame, chunksize=30_000, index=False).value
wb.sheets[0].clear()
wb.sheets[0].range('A1').options(index=False, header=True).value = saveDF
wb.api.SaveAs(savePath + '.txt', FileFormat=FileFormat.xlCSV)
os.remove(savePath)
os.rename(savePath + '.txt', savePath)

问题是我在这里得到错误:

"PermissionError: [WinError 32]该进程无法访问该文件,因为它正在被另一个进程使用:">

这意味着Python在保存文件时尝试重命名文件。

我的问题是:

  1. 是否有一种方法可以覆盖csv文件而无需手动单击"文件已存在"-您想要覆盖它吗?提示?

  2. 是否有什么我可以改变我的代码不得到[WinError 32]上面显示?

  3. 我怎么能改变我的代码不打开excel的两个实例(现在它打开空白一个-可能当我使用"with";语句和第二个与我的文件当我使用app.books.open) ?

事先感谢您的帮助。

我有同样的问题,由excel Writer保存的excel文件被损坏。

  1. 如果您在前面的行中使用pd编写excel文件。ExcelWriter和后来的xlwings使用相同的文件,Writer使用上下文管理器。
  2. 你不必用xlwings覆盖文件,你可以简单地做:wb.save(path=None)。它将以相同的名称保存相同的文件。只要注意你正在使用的文件,如果它是一个健康的excel文件-我的意思是没有损坏。

最新更新