【发布时间】: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