Search code examples
pythonf-string

Why does \n work only in f string when inside print?


I'm working on a school assigment for python/pandas and wanted to try out f strings as seemed very handy way of formatting.

After reading documentation, I realised that I couldn't use \n to format the output. For this code:

    f"Shape of dataset:\n {df.shape} (rows, columns)\n"

I get this output:

Out[38]: 'Shape of dataset:\n (270792, 11) (rows, columns)\n'

Which is exactly what I expected after reading the docs.

But then, when I surround it by a print(), as such:

print(f"Shape of dataset:\n {df.shape} (rows, columns)\n")

I get it looking the way I wanted:

Shape of dataset:
 (270792, 11) (rows, columns)

I know I could just use regular formatting as well, but I'm curious as to why this is. Is it that the f string component is ignored because of the print?


Solution

  • The following are some examples that illustrate the point that when you enter a string into a Python/IPython Repl, the repr form of the string is shown. It does not matter which string formatter you use(f-strings or .format()). However, when you print it, it gets formatted and escapes characters like newlines, tabs etc.

    In [18]: f"a\nb\n"
    Out[18]: 'a\nb\n'
    
    In [19]: print(f"a\nb\n")
    a
    b
    
    
    In [20]: f"a\tb\tc"
    Out[20]: 'a\tb\tc'
    
    In [21]: print(f"a\tb\tc")
    a       b       c
    
    In [22]: a = 1
    
    In [23]: b=2
    
    In [24]: "a={}\nb={}".format(a,b)
    Out[24]: 'a=1\nb=2'
    
    In [25]: print("a={}\nb={}".format(a,b))
    a=1
    b=2
    
    In [26]: "a={}\tb={}".format(a,b)
    Out[26]: 'a=1\tb=2'
    
    In [27]: print("a={}\tb={}".format(a,b))
    a=1     b=2
    

    Python provides a repr() function that shows the printable representation of the object. All statements without the print above use this internally in the Python/IPython console. There is also the str() function that formats the object. Internally, when you print the string, str() is applied first that formats the string.

    In [29]: print(repr(f"a\tb\tc"))
    'a\tb\tc'
    
    In [30]: print(str(f"a\tb\tc"))
    a       b       c