Python正在为输出添加额外的换行符

时间:2013-08-03 01:56:04

标签: python

输入文件:a.txt

aaaaaaaaaaaa
bbbbbbbbbbb
cccccccccccc

python代码:

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

问题:

[root@a1 0]# python read_lines.wsgi
aaaaaaaaaaaa

bbbbbbbbbbb

cccccccccccc

正如您所看到的那样,输出在每个项目之间都有额外的行。

如何防止这种情况?

5 个答案:

答案 0 :(得分:16)

print附加换行符,输入行已经以换行符结尾。

标准解决方案是逐字输出输入行:

import sys

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

PS :对于Python 3(或带有打印功能的Python 2),abarnert的print(…, end='')解决方案是最简单的。

答案 1 :(得分:7)

正如其他答案所解释的那样,每一行都有一个换行符;当你print一个裸字符串时,它会在末尾添加一行。有两种方法可以解决这个问题;其他一切都是对同一两个想法的变异。


首先,您可以在阅读时删除换行符:

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

这将删除任何其他尾随空格,如空格或制表符,以及换行符。通常你不关心这个。如果这样做,您可能希望使用通用换行模式,并删除换行符:

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

但是,如果您知道文本文件将是,例如,Windows换行文件,或者本机到任何平台,我现在正在运行的换行文件,您可以删除恰当的结局:

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)

另一种方法是保留原始换行符,并避免打印额外的换行符。虽然您可以通过sys.stdoutsys.stdout.write(line)来执行此操作,但也可以从print本身开始。

如果您只是在print语句的末尾添加逗号,而不是打印换行符,则会添加“智能空间”。 Exactly what that means有点棘手,但这个想法应该是它应该增加一个空间,而不应该增加空间。像大多数DWIM算法一样,它并不总能让事情正确 - 但在这种情况下,确实如此:

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

当然我们现在假设文件的换行符与你的终端匹配 - 如果你用Unix终端上的经典Mac文件试试这个,你最终会在最后一行打印每行。同样,你可以通过使用通用换行来解决这个问题。

无论如何,您可以通过使用print函数而不是print语句来避免智能空间的DWIM魔力。在Python 2.x中,您可以使用__future__声明来实现此目的:

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

如果您愿意,也可以使用six之类的第三方包装器库。

答案 2 :(得分:2)

最后的每一行作为换行符,python中的print语句也会添加换行符。您可以删除换行符:

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

答案 3 :(得分:1)

你也可以尝试splitlines()功能,它会自动剥离:

f = open('a.txt').read()
for l in f.splitlines():
    print l

答案 4 :(得分:0)

它没有添加换行符,但文件中的每个扫描行都有一个尾随行。

尝试:

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