user1048858
user1048858

Reputation: 393

What happens if I read a file without closing it afterwards?

I used to read files like this:

f = [i.strip("\n") for i in open("filename.txt")]

which works just fine. I prefer this way because it is cleaner and shorter than traditional file reading code samples available on the web (e.g. f = open(...) , for line in f.readlines() , f.close()).

However, I wonder if there can be any drawback for reading files like this, e.g. since I don't close the file, does Python interpreter handles this itself? Is there anything I should be careful of using this approach?

Upvotes: 3

Views: 1361

Answers (4)

Lakshika Parihar
Lakshika Parihar

Reputation: 1163

When we write onto a file using any of the write functions. Python holds everything to write in the file in a buffer and pushes it onto the actual file on the storage device either at the end of the python file or if it encounters a close() function.

So if the file terminates in between then the data is not stored in the file. So I would suggest two options:

  • use with because as soon as you get out of the block or encounter any exception it closes the file,

       with open(filename , file_mode) as file_object:
               do the file manipulations........
    
  • or you can use the flush() function if you want to force python to write contents of buffer onto storage without closing the file.

    file_object.flush()
    

For Reference: https://lerner.co.il/2015/01/18/dont-use-python-close-files-answer-depends/

Upvotes: 0

Karadur
Karadur

Reputation: 1246

It might be fine in a limited number of cases, e.g. a temporary test. Python will only close the file handle after it finishes the execution. Therefore this approach is a no-go for a proper application.

Upvotes: 0

TerryA
TerryA

Reputation: 59974

From the docs:

When you’re done with a file, call f.close() to close it and free up any system resources taken up by the open file.

You should always close a file after working with it. Python will not automatically do it for you. If you want a cleaner and shorter way, use a with statement:

with open("filename.txt") as myfile:
    lines = [i.strip("\n") for i in myfile]

This has two advantages:

  • It automatically closes the file after the with block

  • If an exception is raised, the file is closed regardless.

Upvotes: 1

steveha
steveha

Reputation: 76695

This is the recommended way:

with open("filename.txt") as f:
    lines = [line.strip("\n") for line in f]

The other way may not close the input file for a long time. This may not matter for your application.

The with statement takes care of closing the file for you. In CPython, just letting the file handle object be garbage-collected should close the file for you, but in other flavors of Python (Jython, IronPython, PyPy) you definitely can't count on this. Also, the with statement makes your intentions very clear, and conforms with common practice.

Upvotes: 4

Related Questions