Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Very basic Python question (strings, formats and escapes)

Tags:

python

string

I am starting to learn Python with an online guide, and I just did an exercise that required me to write this script:

from sys import argv

script, filename = argv

print "We're going to erase %r." % filename
print "If you don't want that, hit CTRL-C (^C)."
print "If you do want that, hit RETURN."

raw_input("?")

print "Opening the file..."
target = open(filename, 'w')

print "Truncating the file. Goodbye!"
target.truncate()

print "Now I'm going to ask you for three lines."

line1 = raw_input("line 1: ")
line2 = raw_input("line 2: ")
line3 = raw_input("line 3: ")

print "I'm going to write these to the file."

target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")

print "And finally, we close it."
target.close()

I got it to run fine, but then the guide said: "There's too much repetition in this file. Use strings, formats, and escapes to print out line1, line2, and line3 with just one target.write() command instead of 6."

I'm not sure how to do this. Can anyone help? Thanks!

like image 684
Juan Soto Avatar asked Jun 18 '11 05:06

Juan Soto


1 Answers

The guide is suggesting creating a single string and writing it out rather than callingwrite() six time which seems like good advice.

You've got three options.

You could concatentate the strings together like this:

line1 + "\n" + line2 + "\n" + line3 + "\n"

or like this:

"\n".join(line1,line2,line3) + "\n"

You could use old string formatting to do it:

"%s\n%s\n%s\n" % (line1,line2,line3)

Finally, you could use the newer string formatting used in Python 3 and also available from Python 2.6:

"{0}\n{1}\n{2}\n".format(line1,line2,line3)

I'd recommend using the last method because it's the most powerful when you get the hang of it, which will give you:

target.write("{0}\n{1}\n{2}\n".format(line1,line2,line3))
like image 197
Dave Webb Avatar answered Sep 30 '22 10:09

Dave Webb