Questions about file object and close()
John Marshall
John.Marshall at ec.gc.ca
Thu Dec 9 09:20:36 EST 2004
On Thu, 2004-12-09 at 08:41 -0500, Peter Hansen wrote:
> John Marshall wrote:
> > Hi,
> >
> > Does anyone see a problem with doing:
> > data = file("tata").read()
> >
> > Each time this is done, I see a new file
> > descriptor allocated (Linux) but not
> > released.
> >
> > 1) Will there ever be a point where I
> > will have a problem with file
> > descriptors because the garbage
> > collector has _not_ yet collected the
> > file objects?
>
> Should be easy to check. Write a loop which
> does that many times. There are a finite
> number of file descriptors available, so if
> it's going to fail, it will fail fairly
> quickly.
>
I did do this and it did not fail. My concern
was since the close() is not done explicitly
by me, and does not seem to be called in
a file.__del__() or otherwise, I was not
sure. I want to be sure! Given your comment
below about the CPython implementation, there
is no guarantee which seems unreasonable for
such an operation.
It seems to me that a file.__del__() _should_
call a file.close() to make sure that the file
is closed as a clean up procedure before
releasing the object. I cannot see why this
would not be the prescribed behavior and thus
my question. Isn't that what __del__
(destructors) are supposed to handle--cleaning
up?
> > 3) There is no file.__del__() as far as I
> > can tell at the Python level. Are files
> > opened by the calls above properly
> > closed when the objects are destroyed
> > and collected?
>
> Yes, but you can only count on this happening
> in the CPython implementation. Nevertheless,
> it's still widely considered more than just good style
> to explicitly close your files within a finally
> clause, even in CPython where technically you don't
> have to in most cases:
>
> f = file("tata")
> try:
> data = f.read()
> finally:
> f.close()
>
> The above is quite robust and should be your model
> for all file access, at least until you're much more
> experienced with Python.
How would more experience change this? Assuming I
am catching any exceptions I am interested in, why
wouldn't the following be just as good?
try:
data = file("tata").read()
except:
...
> One should use the open().read() idiom only in small
> utility scripts and other such short-running applications.
I don't see why this is so only for small scripts. As
I question above, why doesn't the file object clean up
after itself as a guaranteed course of action?
Of course, I could implement my own file object to
guarantee the clean up and be on my way. But I am
still surprised at what I am seeing.
Thanks,
John
More information about the Python-list
mailing list