【问题标题】:How to ensure a file is closed for writing in Python?如何确保关闭文件以便用 Python 编写?
【发布时间】:2015-07-22 16:55:52
【问题描述】:

here 描述的问题最初看起来可以通过在运行程序之前在 Excel 中关闭电子表格来解决。

然而,事实证明,关闭 Excel 是必要条件,但不是充分条件。这个问题仍然存在,但不是在每台 Windows 机器上,也不是每次都出现(有时它在一次执行后发生,有时是两次)。

我已经修改了程序,现在它从一个电子表格读取并写入另一个电子表格,但问题仍然存在。我什至继续在运行程序之前以编程方式杀死任何挥之不去的 Python 进程。还是不开心。

openpyxlsave() 函数实例化ZipFile,因此:

archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)

... 使用Zipfile 然后使用它尝试以'wb' 模式打开文件,因此:

if isinstance(file, basestring):
    self._filePassed = 0
    self.filename = file
    modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
    try:
        self.fp = open(file, modeDict[mode])
    except IOError:
        if mode == 'a':
            mode = key = 'w'
            self.fp = open(file, modeDict[mode])
        else:
            raise

根据the docs

在 Windows 上,附加到模式的 'b' 以二进制模式打开文件,所以 还有像“rb”、“wb”和“r+b”这样的模式。 Windows 上的 Python 区分文本文件和二进制文件;行尾 文本文件中的字符在数据时会自动稍微改变 被读或写。这种对文件数据的幕后修改 对 ASCII 文本文件很好,但它会破坏这样的二进制数据 在 JPEG 或 EXE 文件中。阅读时要非常小心使用二进制模式 并编写此类文件。在 Unix 上,将 'b' 附加到 模式,因此您可以独立于平台使用它来处理所有二进制文件 文件。

...这解释了为什么必须使用模式'wb'。

在 Python 文件打开过程中是否有某些东西可能使文件处于某种“开放”状态?

Windows: 8

Python: 2.7.10

openpyxl:最新

【问题讨论】:

  • 不确定我是否理解您的问题,但您不应该在操作结束时直接self.fp.close() 吗?
  • 记录 Windows、python 和 openpyxl 版本的工作和不工作时会很有用。您是否考虑过填写错误报告?
  • @rroszkowiak 上面的代码摘自 ZipFile,它是 Python 标准库的一部分。我不想碰它。
  • @CraigS.Anderson 最好使用with 语法。
  • 抱歉,我不明白问题出在哪里。 Python 关闭是立即的。如果调用 Excel,则更有可能是任何文件共享问题的原因。在读取数据文件后关闭它是草率的,并故意创建一个文件锁定文件,该文件在不再需要后会持续数秒。你能缩小你看到的症状范围吗?

标签: python python-2.7 file-io ioerror


【解决方案1】:

两个建议:

首先是使用with正确关闭文件。

with open("some.xls", "wb") as excel_file:
    #Do something

最后,文件将自行关闭(请参阅this)。

您还可以复制文件并处理复制的文件。

import shutil
shutil.copyfile(src, dst)

https://docs.python.org/2/library/shutil.html#shutil.copyfile

【讨论】:

  • 打开文件的是openpyxl代码,所以我宁愿不要管它。不过,您复制文件的建议非常好,我一定会试用的。
猜你喜欢
  • 2021-04-08
  • 2019-02-10
  • 2015-08-23
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多