[Image-SIG] Image.open should close file when it cannot identify image

Fredrik Lundh fredrik at pythonware.com
Fri Oct 2 12:30:38 CEST 2009


On Fri, Oct 2, 2009 at 12:06 PM, Oliver Tonnhofer <olt at omniscale.de> wrote:
> Hi,
>
> I want to remove files that PIL can't open. But the following fails on
> Windows, because Image.open doesn't close the file.

Unless you hang on to the image object, Python will close things when
the image object itself goes away.

Your workaround doesn't handle anything that might happen during open;
to force the file to be closed if it cannot be fully read no matter
what caused the problem, I'd recommend doing something like:

    file = open(filename, "rb")
    try:
        im = Image.open(file)
        im.load()
    except StandardError:
        file.close() # force close
        ... process unreadable file ...
    else:
        ... process image ...

</F>




>
> ----
> import os
> import Image
> try:
>    f = open('test.test', 'w')
>    f.close()
>    Image.open('test.test')
> finally:
>    os.remove('test.test')
> ----
> results in:
> WindowsError: [Error 32] The process cannot access the file because it is
> being
> used by another process: 'test.test'
>
>
> Below is a simple fix.
>
> Regards,
> Oliver
>
> PS: please cc me on replies to the list.
>
> ----
> --- PIL/Image.py.orig   2009-10-02 12:02:26.000000000 +0200
> +++ PIL/Image.py        2009-10-02 12:03:12.000000000 +0200
> @@ -1913,6 +1913,9 @@
>         except (SyntaxError, IndexError, TypeError):
>             pass
>
> +    if filename:
> +        fp.close()
> +
>     raise IOError("cannot identify image file")
>
>  #
>
> _______________________________________________
> Image-SIG maillist  -  Image-SIG at python.org
> http://mail.python.org/mailman/listinfo/image-sig
>


More information about the Image-SIG mailing list