Exercise 17: More Files
Now let's do a few more things with files. We're going to actually write a Python script to copy one file to another. It'll be very short but will give you some ideas about other things you can do with files.
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?
in_file = open(from_file)
indata = in_file.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."
out_file = open(to_file, 'w')
print "Alright, all done."
You should immediately notice that we import another handy command named exists. This returns True if a file exists, based on its name in a string as an argument. It returns False if not. We'll be using this function in the second half of this book to do lots of things, but right now you should see how you can import it.
Using import is a way to get tons of free code other better (well, usually) programmers have written so you do not have to write it.
What You Should See
Just like your other scripts, run this one with two arguments: the file to copy from and the file to copy it to. I'm going to use a simple test file named test.txt again:
$ cat test.txt
This is a test file.
$ python ex17.py test.txt new_file.txt
Copying from test.txt to new_file.txt
The input file is 21 bytes long
Does the output file exist? False
Ready, hit RETURN to continue, CTRL-C to abort.
Alright, all done.
It should work with any file. Try a bunch more and see what happens. Just be careful you do not blast an important file.
Did you see that trick I did with cat to show the file? You can
learn how to do that in Appendix A.
- Go read up on Python's import statement, and start python to try it out. Try importing some things and see if you can get it right. It's alright if you do not.
- This script is really annoying. There's no need to ask you before doing the copy, and it prints too much out to the screen. Try to make it more friendly to use by removing features.
- See how short you can make the script. I could make this one line long.
- Notice at the end of the WYSS I used something called cat? It's an old command that "con*cat*enates" files together, but mostly it's just an easy way to print a file to the screen. Type man cat to read about it.
- Windows people, find the alternative to cat that Linux/OSX people have. Do not worry about man since there is nothing like that.
- Find out why you had to do output.close() in the code.
Common Student Questions
- Why is the 'w' in quotes?
- That's a string. You've been using them for a while now, so make sure you know what a string is.
- No way you can make this one line!
- That ; depends ; on ; how ; you ; define ; one ; line ; of ; code.
- What does the len() function do?
- It gets the length of the string that you pass to it then returns that as a number. Play with it.
- When I try to make this script shorter I get an error when I close the files at the end.
- You probably did something like this, indata = open(from_file).read(), which means you don't need to then do in_file.close() when you reach the end of the script. It should already be closed by Python once that one line runs.
- Is it normal to feel like this exercise was really hard?
- Yes, it is totally normal. Programming may not "click" for you until maybe even Exercise 36, or it might not until you finish the book and then make something with Python. Everyone is different, so just keep going and keep reviewing exercises that you had trouble with until it clicks. Be patient.
- I get a Syntax:EOL while scanning string literal error.
- You forgot to end a string properly with a quote. Go look at that line again.