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."
raw_input()
out_file = open(to_file, 'w')
out_file.write(indata)
print "Alright, all done."
out_file.close()
in_file.close()
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.
Warning
Did you see that trick I did with cat to show the file? It only works
on Linux or OSX, on Windows use type to do the same thing. You can
also create files with cat > thefile.txt and then hit CTRL-d (CTRL-z)
to end the file.
Study Drills
- 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 1 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.