python - PermissionError 仅在第一次引发 - pd.ExcelWriter.save()

标签 python python-3.x pandas

我正在尝试执行以下代码片段:

while 1:
    print("test")
    try:
        tentativa += 1
        writer.save()
        print("test 2")
        break
    except PermissionError:
        print("test 3")
        if tentativa > 3:
            sys.exit(-1)
        input(f"(Tentativa {tentativa} de 3) Tecle ENTER para tentar novamente... ")

writer 对象是一个 pd.ExcelWriter,使用 xlsxwriter 作为引擎。 当您使用 save() 方法时,它会尝试将 Excel 文件保存到我通知的目录中。这没问题。但是,当 Excel 文件打开时,此方法会引发PermissionError,因为它无法覆盖该文件。这也没有问题...

但是,如果我保持文件打开,并重试运行相同的方法,它不会引发异常,因此 except 子句没有什么可捕获的,它会打印“test”和“test” 2"并打破了 while...

第一个周期:“测试”和“测试 3”(文件已打开)

第二个周期:“测试”和“测试 2”(文件已打开)

有人知道为什么这个方法在第二个 while 周期没有引发异常吗?这是一个错误吗?

最佳答案

我从xlsxwriter中检查了Workbook对象,它具有以下代码:

def close(self):
        """
        Call finalization code and close file.

        Args:
            None.

        Returns:
            Nothing.

        """
        if not self.fileclosed:
            self.fileclosed = 1
            self._store_workbook()

由于内存中的实例在第二个 while 循环中是相同的,所以 workbook.filelined 仍然是 1 (True),因此方法 _store_workbook() 不会' t 被调用。随着这种情况的继续,不会引发任何异常。

所以我为此方法做了一个解决方法,即添加 writer.book.fileclose 行。

结果:

while 1:
    print("test")
    writer.book.fileclosed = 0
    try:
        tentativa += 1
        writer.save()
        print("test 2")
        break
    except PermissionError:
        print("test 3")
        if tentativa > 3:
            sys.exit(-1)
        input(f"(Tentativa {tentativa} de 3) Tecle ENTER para tentar novamente... ")

这个片段效果很好。

但不确定 fileclose 变量的目的是什么。

关于python - PermissionError 仅在第一次引发 - pd.ExcelWriter.save(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57187746/

相关文章:

python - 如何计算整列最接近的纬度经度?

python - 找不到可用的临时目录

python - 无法在 Python 3.7 中导入 PyQtChart

python - 仅从数据框中返回空白或零值

python - 将嵌套列表组合成子列表的唯一组合

django - Celery 无法从 Docker 容器内连接到本地 PostgreSQL

python - Pandas 数据框插入缺失的行并填充上一行

python - 如何从文件中获取 Unix 权限掩码?

c++ - Boost Python 的性能

python - 嵌套字典和检索键/值