How to Suppress Linefeed Using str.format - python

I know how to use end="" with the print function in Python 3.0 to suppress a linefeed, but how do I suppress a linefeed while using the str.format method?
print("Hello", end=",") # Works
print(" Hola")
print("{}".format(""))
print("{}".format("Hello", end = ",")) # Doesn't work
print("{}".format(" Hola"))

The newline is being added by the print function, not str.format. From the docs:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Print objects to the text stream file, separated by sep and followed by end.
Notice how the end parameter defaults to '\n' (a newline). There is no way for str.format to remove this newline because it isn't there until after the formatted string is given to print.
You will need to use end="":
print("{}".format("Hello"), end="")

Related

Split a Unicode string only at universal newlines (\n, \r, \r\n)

In Python 3, the str.splitlines method splits at many line boundaries, including the "universal newlines" "\r", "\n", and "\r\n", as well as others.
Suppose I have a Unicode string and I want to split it into lines, only recognizing universal newlines "\r", "\n", and "\r\n". Example:
my_text = 'Line 1\f\rLine 2\r\nLine 3\f...\nLine 4\n'
# Desired output:
lines = split_only_universal_newlines(my_text)
print(lines)
# ['Line 1\x0c\r', 'Line 2\r\n', 'Line 3\x0c...\n', 'Line 4\n']
# Note that the form feed character \f is printed as '\x0c'.
# Incorrect output produced by str.splitlines:
lines = my_text.splitlines(keepends=True)
print(lines)
# ['Line 1\x0c', '\r', 'Line 2\r\n', 'Line 3\x0c', '...\n', 'Line 4\n']
The reason I need to only recognize universal newlines is for consistency with other code/tools that follow that convention.
What is the cleanest or most Pythonic way of doing this?
Besides regular expressions, there are two approaches that I can think of. The first is to employ bytes.splitlines, which according to the doc splits only universal newlines.
A solution based on this idea is as follows.
lines = [l.decode() for l in my_text.encode().splitlines(keepends=True)]
Another approach is to use the Text IO classes:
import io
lines = list(io.StringIO(my_text, newline=''))
Here, the newline keyword works as follows according to the io.StringIO docs:
The newline argument works like that of TextIOWrapper.
and the io.TextIOWrapper docs:
When reading input from the stream, if newline is None, universal newlines mode is enabled. Lines in the input can end in '\n', '\r', or '\r\n', and these are translated into '\n' before being returned to the caller. If it is '', universal newlines mode is enabled, but line endings are returned to the caller untranslated. If it has any of the other legal values, input lines are only terminated by the given string, and the line ending is returned to the caller untranslated.
The latter approach looks better to me because it does not need to create another copy of the input string (like my_text.encode() does). Meanwhile, if you want to iterate over each line in the input you can just write:
for line in io.StringIO(my_text, newline=''):
...
Use io.StringIO(my_text, newline='').readlines(). The newline='' means (only) universal newlines are treated as line separators, and furthermore line endings are returned to the caller unchanged.
import io
lines = io.StringIO(my_text, newline='').readlines()
print(lines)
# ['Line 1\x0c\r', 'Line 2\r\n', 'Line 3\x0c...\n', 'Line 4\n']
Python documentation:
io.StringIO
readlines()
Behavior of newline=''

Removing '\n' character from print statement

I have the following code when writing to a text file:
def writequiz(quizname,grade,perscore,score,username):
details=[quizname,username,grade,perscore,score]
with open('quizdb','a') as userquiz:
print(details,file=userquiz)
Now the code is doing what I want it to (writing to a new line every time), however if I wanted to write every list to the same line in the text file how would I do this using the print method as used above? I know I could use file.write, but how do I remove the newline character in the print statement? Slightly hypothetical but it was bugging me.
If you are using python 2.x, you can do the following:
print >> userquiz, details, # <- notice the comma at the end
If using pytnon 3.x, you can do this:
print(details,file=userquiz, end = " ")
Check print documentation.
You can set the end parameter of print to be an empty string (or some other character):
print(details, file=userquiz, end='')
From the docs, you can see that it defaults to a newline:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Print objects to the text stream file, separated by sep and followed by end. sep, end, file and flush, if present, must be given
as keyword arguments.
This is what is being printed to the file currently.

Why does '\n' output an extra blank line in Python3

In python3 print('\n') will generate an extra blank line. Could someone make a brief explanation about this?
Thanks in advance.
In the documentation for print it is stated that:
All non-keyword arguments are converted to strings like str() does and written to the stream, separated by sep and followed by end.
The default value for end is '\n', so Python first prints the supplied '\n' and then end which equals '\n' too; that's why you see two blank lines.
Change the default value if you don't want that:
print('\n', end='')
Note that this also applies to Python 2.x's print statement, it also writes '\n' at the end. You can change the behavior there by appending a comma character.

Python printing issue with space

Hello I am currently working on something and I am trying to print output as such in python
hello=10
but my code below is printing it as such
hello= 10
10 is an int i have tried these codes but none work
print "hello=",10
print "hello=",str(10)
print "hello=",str(10).strip()
i would appreciate the help thank you
Simply concatenate the strings:
print "hello="+str(10)
Use str.format,
print("hello={}".format(10))
PS: The print statement has been replaced with a print() function since Python 3.0.
Old: print x, # Trailing comma suppresses newline
New: print(x, end=" ") # Appends a space instead of a newline
Refer to Print Is A Function for the detailed descriptions.
If you use print with multiple arguments, separated by ,, a single space ' ' is inserted as a separator in between each of those.
When using Python 3's print function, you can specify the sep parameter; default is ' '.
>>> from __future__ import print_function # when in Python 2
>>> print("hello=", 10)
hello= 10
>>> print("hello=", 10, sep="")
hello=10
>>> print("hello=", 10, sep="###")
hello=###10
For Python 2's print statement, there is to the best of my knowledge no such option.
You may also consider using the Python 3 compatible print() function:
This function can be used after a __future__ directive:
from __future__ import print_function
print("hello=", 10, sep='')
Output:
hello=10
The print() function as a sep keyword argument which allows you to replace the space separator by an empty string.
Here is the online help:
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
The call "print" will place a space for a comma.
Yes, Python provides many ways to print the strings as above mentioned, I still would like to construct the output with C or Java style format:
print "hello=%d" % 10

Why print command gives a new line even though there is no data to print

Just typing print only gives newline in python. Typing print without the brackets in 3.x will also gives a newline. Why?
Because the documentation says so
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Print objects to the text stream file, separated by sep and followed by end. sep, end and file, if present, must be given as keyword arguments.
All non-keyword arguments are converted to strings like str() does and written to the stream, separated by sep and followed by end. Both sep and end must be strings; they can also be None, which means to use the default values. If no objects are given, print() will just write end.
The file argument must be an object with a write(string) method; if it is not present or None, sys.stdout will be used. Since printed arguments are converted to text strings, print() cannot be used with binary mode file objects. For these, use file.write(...) instead.
Whether output is buffered is usually determined by file, but if the flush keyword argument is true, the stream is forcibly flushed.
Changed in version 3.3: Added the flush keyword argument.
Note that end is defaulted to '\n' which is a new line.
In Python 3, print is now a function. It will print a new line character at the end of your statement.
If you don't specify an "end" it will by default use a new line character.
You can prevent this by doing something such as:
print("hello world", end="")
Because the default parameter in print is \n for the end,
though if you pass parameter for print end variable as \t or space , then you can see the same !
But it works 2.7 and above!
It is interesting how languages differ in this.
print in the Korn shell (ksh) has the same behaviour as python, i.e. it adds a newline. Bash does not have a print, relying on echo instead, which also adds a newline (which, like python, can be suppressed).
print in Perl does not, and caused so much inconvenience that another version, called say, was added which does add a newline.
Ruby and PHP are like Perl in that print also does not add a newline. This of course is less of an issue when embedded in HTML.
If you look at other languages, for example here you will find opinion divided as to whether a newline should be added or not. The removal of the newline in Python is discussed in PEP259.

Categories