While working through this exercise I ran into a problem.
from sys import argv
from os.path import exists
script, from_file, to_file = argv
print "Copying from %s to %s" % (from_file, to_file)
# we could do these two on one line too, how?
input = open(from_file)
indata = input.read()
print "The input file is %d bytes long" % len(indata)
print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."
raw_input()
output = open(to_file, 'w')
output.write(indata)
print "Alright, all done."
output.close()
input.close()
The line # we could do these two on one line too, how? is what’s confusing me. The only answer I could come up with was:
indata = open(from_file).read()
This performed the way I wanted to, but it requires me to remove:
input.close()
as the input variable no longer exists. How then, can I perform this close operation?
How would you solve this?
The preferred way to work with resources in python is to use context managers:
The
withstatement takes care of closing the resource and cleaning up.You could write that on one line if you want:
however, this is considered bad style in python.
You can also open multiple files in a
withblock:Funny enough, I asked exactly the same question back when I started learning python.