如何确保文件被关闭以便在Python中编写?

时间:2015-07-22 16:55:53

标签: python python-2.7 file-io ioerror

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

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

我已修改程序,使其现在从一个电子表格中读取并写入另一个电子表格,但问题仍然存在。在运行程序之前,我甚至以编程方式杀死任何延迟的Python进程。仍然没有快乐。

openpyxl save()函数实例化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:最新

1 个答案:

答案 0 :(得分:2)

两个建议:

首先使用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