Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write multiple strings in one line?

Tags:

python

string

I've started to learn Python with LPTHW and I've gotten to exercise 16:

http://learnpythonthehardway.org/book/ex16.html

And feel like an idiot because I can't figure out one of the seemingly simple "extra credit" assignments that wants the following:

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

To be condensed to one line of code. I've tried some of the following:

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

Or:

target.write('line1 \n, line2 \n, line3 \n')

Or:

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3)

I just can't get it to rewrite the line1, line2, and line3 strings all in the same line. And I've tried various other combinations with and without commas, quotes, etc. I keep getting varying errors, like Invalid Syntax or that I have too many arguments.

like image 517
jstacks Avatar asked Jan 01 '12 00:01

jstacks


People also ask

How do you write multiple strings in a text file in Python?

We use the write() method to insert a single string into a text file and the writelines() method to insert multiple strings into a text file. To write something to a binary file, we need to first convert our input into binary form. To convert an array of numbers into a binary array, we can use bytearray() function.

How to print multiple strings in Python?

How do I print multiple strings on the same line in Python? To print on the same line in Python, add a second argument, end=' ', to the print() function call.

How to handle multiline string in Python?

A multiline string in Python begins and ends with either three single quotes or three double quotes. Any quotes, tabs, or newlines in between the “triple quotes” are considered part of the string. Python's indentation rules for blocks do not apply to lines inside a multiline string.


2 Answers

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

'\n' only make sense inside a string literal. Without the quotes, you don't have string literals.

target.write('line1 \n, line2 \n, line3 \n')

Ok, now everything is a string literal. But you want line1, line2, line3 to not be string literals. You need those as python expressions to refer the variables in question. Basically, you have to put quotes around strings that are actually text like "\n" but not around variables. If you did that, you might have gotten something like:

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

What is 2 2? It's nothing. You have to specify to python how to combine the two pieces. So you can have 2 + 2 or 2 * 2 but 2 2 doesn't make any sense. In this case, we use add to combine two strings

target.write(line + '\n' + line2 + '\n' + line3 + '\n')

Moving on,

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3)

Again \n only makes sense inside a string literal. The % operator when used to produce strings takes a string as its left side. So you need all of that formatting detail inside a string.

target.write('%r \n', '%r \n', '%r \n') % (line1, line2, line3)

But that produce 3 string literals, you only want one. If you did this, write complained because it excepts one string, not 3. So you might have tried something like:

target.write('%r \n%r \n%r \n') % (line1, line2, line3)

But you want to write the line1, line2, line3 to the file. In this case, you are trying to the formatting after the write has already finished. When python executes this it will run the target.write first leaving:

None % (line1, line2, line3)

Which will do nothing useful. To fix that we need to to put the % () inside the .write()

target.write('%r\n%r\n%r\n' % (line1, line2, line3))
like image 161
Winston Ewert Avatar answered Oct 05 '22 22:10

Winston Ewert


Your last try looks promising. It should look like:

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

this applies the operator % to a string (with 3 %s placeholders) and a tuple of values to substitute (here, strings). The result is the formatted string.

So you'd need to wrap that in the function which takes the result:

target.write("%s \n %s \n %s" % (line1, line2, line3) )
like image 26
Kos Avatar answered Oct 05 '22 22:10

Kos