How to ensure a file is closed for writing in Python?
Question: The issue described [here](http://stackoverflow.com/questions/31447975/python-
open-write-on-windows-permission-issue-ioerror-for-file-created) looked
initially like it was solvable by just having the spreadsheet closed in Excel
before running the program.

It transpires, however, that having Excel closed is a necessary, but not
sufficient, condition. The issue still occurs, but not on every Windows
machine, and not every time (sometimes it occurs after a single execution,
sometimes two).

I've modified the program such that it now reads from one spreadsheet and
writes to a different one, still the issue presents itself. I even go on to
programmatically kill any lingering Python processes before running the
program. Still no joy.

The `openpyxl` `save()` function instantiates `ZipFile` thus:

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

... with `Zipfile` then using that to attempt to open the file in mode `'wb'`
thus:

    
    
    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
    

According to [the
docs](https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-
files):

> 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.

... which explains why mode 'wb' must be used.

Is there something in Python file opening that could possibly leave the file
in some state of "openness"?

**Windows:** 8

**Python:** 2.7.10

**openpyxl:** latest


Answer: Two suggestions:

First is to use `with` to close the file correctly.

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

At the end of that the file will close on its own (see
[this](https://docs.python.org/2/reference/compound_stmts.html#with)).

You can also make a copy of the file and work on the copied file.

    
    
    import shutil
    shutil.copyfile(src, dst)
    

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

