How to use newline '\n' in f-string to format output in Python 3.6?
You can't. Backslashes cannot appear inside the curly braces {}
; doing so results in a SyntaxError
:
>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash
This is specified in the PEP for f-strings:
Backslashes may not appear inside the expression portions of f-strings, [...]
One option is assinging '\n'
to a name and then .join
on that inside the f
-string; that is, without using a literal:
names = ['Adam', 'Bob', 'Cyril']
nl = '\n'
text = f"Winners are:{nl}{nl.join(names)}"
print(text)
Results in:
Winners are:
Adam
Bob
Cyril
Another option, as specified by @wim, is to use chr(10)
to get \n
returned and then join there. f"Winners are:\n{chr(10).join(names)}"
Yet another, of course, is to '\n'.join
beforehand and then add the name accordingly:
n = "\n".join(names)
text = f"Winners are:\n{n}"
which results in the same output.
Note:
This is one of the small differences between f
-strings and str.format
. In the latter, you can always use punctuation granted that a corresponding wacky dict is unpacked that contains those keys:
>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"
(Please don't do this.)
In the former, punctuation isn't allowed because you can't have identifiers that use them.
Aside: I would definitely opt for print
or format
, as the other answers suggest as an alternative. The options I've given only apply if you must for some reason use f-strings.
Just because something is new, doesn't mean you should try and do everything with it ;-)
You don't need f-strings or other formatters to print a list of strings with a separator. Just use the sep
keyword argument to print()
:
names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='\n')
Output:
Winners are:
Adam
Bob
Cyril
That said, using str.join()
/str.format()
here would arguably be simpler and more readable than any f-string workaround:
print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))
You can't use backslashes in f-strings as others have said, but you could step around this using os.linesep
(although note this won't be \n
on all platforms, and is not recommended unless reading/writing binary files; see Rick's comments):
>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril
Or perhaps in a less readable way, but guaranteed to be \n
, with chr()
:
>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril