Python is adding extra newline to the output

Solution 1:

print appends a newline, and the input lines already end with a newline.

A standard solution is to output the input lines verbatim:

import sys

with open("a.txt") as f:
    for line in f:
        sys.stdout.write(line)

PS: For Python 3 (or Python 2 with the print function), abarnert's print(…, end='') solution is the simplest one.

Solution 2:

As the other answers explain, each line has a newline; when you print a bare string, it adds a line at the end. There are two ways around this; everything else is a variation on the same two ideas.


First, you can strip the newlines as you read them:

with open("a.txt") as f:
    for line in f:
        print line.rstrip()

This will strip any other trailing whitespace, like spaces or tabs, as well as the newline. Usually you don't care about this. If you do, you probably want to use universal newline mode, and strip off the newlines:

with open("a.txt", "rU") as f:
    for line in f:
        print line.rstrip('\n')

However, if you know the text file will be, say, a Windows-newline file, or a native-to-whichever-platform-I'm-running-on-right-now-newline file, you can strip the appropriate endings explicitly:

with open("a.txt") as f:
    for line in f:
        print line.rstrip('\r\n')

with open("a.txt") as f:
    for line in f:
        print line.rstrip(os.linesep)

The other way to do it is to leave the original newline, and just avoid printing an extra one. While you can do this by writing to sys.stdout with sys.stdout.write(line), you can also do it from print itself.

If you just add a comma to the end of the print statement, instead of printing a newline, it adds a "smart space". Exactly what that means is a bit tricky, but the idea is supposed to be that it adds a space when it should, and nothing when it shouldn't. Like most DWIM algorithms, it doesn't always get things right—but in this case, it does:

with open("a.txt") as f:
    for line in f:
        print line,

Of course we're now assuming that the file's newlines match your terminal's—if you try this with, say, classic Mac files on a Unix terminal, you'll end up with each line printing over the last one. Again, you can get around that by using universal newlines.

Anyway, you can avoid the DWIM magic of smart space by using the print function instead of the print statement. In Python 2.x, you get this by using a __future__ declaration:

from __future__ import print_function
with open("a.txt") as f:
    for line in f:
        print(line, end='')

Or you can use a third-party wrapper library like six, if you prefer.

Solution 3:

What happens is that each line as a newline at the end, and print statement in python also adds a newline. You can strip the newlines:

with open("a.txt") as f:
    for line in f:
        print line.strip()