I am in python and there is a lot of ways to access files.
Method 1:
fp = open("hello.txt", "w")
fp.write("No no no");
fp.close()
fp = open("hello.txt", "r")
print fp.read()
fp.close()
Method 2:
open("hello.txt", "w").write("hello world!")
print open("hello.txt", "r").read()
Method 3:
with open("hello.txt","w") as f:
f.write("Yes yes yes")
with open("hello.txt") as f:
print f.read()
Is there a specific advantage in using each of these?
Stuff I know:
- Method 2 and Method 3 closes the file automatically, but
Method 1 doesn’t. - Method 2 doesn’t give you a handle to do multiple operations.
You should use the third method.
There is a common pattern in programming where to use some object you have set it up, run your code, and tear it down again. File handles are one example of this: you have to open the file, run your code, and then close the file. This last is not optional — it’s important for the operating system to know that you are done with it, and for Python to flush all the data out of its IO buffers.
Now, CPython is a reference counted language. That means that it counts how many pieces of code ‘know about’ a given object, so that when that count becomes zero it can clean up said object and reuse its space in memory. In method 2, the reference count of the file object becomes zero, which allows Python to clean it up. And file objects’ cleanup method also closes them. However, you should in general not rely on this — reference counting is an implementation detail of the standard version of Python, and there’s no guarantee that whatever you’re using to run the program will do the same. That’s why you shouldn’t use method 2.
Method 1 is better, because you explicitly close the file — as long as you reach the
.close()function call! If an exception was thrown in the middle of that code block, theclosewould not be reached, and the file would not be explicitly closed. So you should really wrap the middle code in atry... finallyblock.Method 3 is therefore best: you use the
withstatement — an idiomatic way of enclosing the.closein afinallyblock — to close the file, so you don’t have to worry about the extra syntactic fluff oftry... except.