如何确保文件关闭以写入 Python?

How to ensure a file is closed for writing in Python?

描述的问题 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

On Windows, 'b' appended to the mode opens the file in binary mode, so there are also modes like 'rb', 'wb', and 'r+b'. Python on Windows makes a distinction between text and binary files; the end-of-line characters in text files are automatically altered slightly when data is read or written. This behind-the-scenes modification to file data is fine for ASCII text files, but it’ll corrupt binary data like that in JPEG or EXE files. Be very careful to use binary mode when reading and writing such files. On Unix, it doesn’t hurt to append a 'b' to the mode, so you can use it platform-independently for all binary files.

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

在打开 Python 文件时是否有某些东西可能会使文件处于 "openness" 的某种状态?

Windows: 8

Python: 2.7.10

openpyxl:最新

两条建议:

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