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

Python正在向输出中添加额外的换行符,python,Python,输入文件:a.txt aaaaaaaaaaaa bbbbbbbbbbb cccccccccccc python代码: with open("a.txt") as f: for line in f: print line 问题是: aaaaaaaaaaaa bbbbbbbbbbb cccccccccccc 正如您所看到的,输出在每个项目之间有额外的行 如何防止这种情况发生?这不是添加换行符,而是文件中扫描的每一行都有一个尾随行 尝试: 实际情况

输入文件:
a.txt

aaaaaaaaaaaa
bbbbbbbbbbb
cccccccccccc
python代码:

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

aaaaaaaaaaaa

bbbbbbbbbbb

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


如何防止这种情况发生?

这不是添加换行符,而是文件中扫描的每一行都有一个尾随行

尝试:


实际情况是,每一行在末尾都是一个换行符,python中的
print
语句也会添加一个换行符。您可以删除换行符:

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

print
追加一个换行符,而输入行已经以换行符结束

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

import sys

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

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

您也可以尝试
splitlines()
函数,它会自动剥离:

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

正如其他答案所解释的,每一行都有一个新行;当您打印一个空字符串时,它会在末尾添加一行。有两种方法可以解决这个问题;其他一切都是同一两个想法的变体


首先,您可以在阅读新行时将其剥离:

with open("a.txt") as f:
    for line in f:
        print line.rstrip()
这将去除任何其他尾随空格,如空格或制表符,以及换行符。通常你不在乎这个。如果这样做,您可能希望使用通用换行符模式,并去掉换行符:

with open("a.txt") as f:
    for line in f:
        print line.strip()
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.stdout.write(line)
写入
sys.stdout
来执行此操作,但您也可以通过
print
本身执行此操作

如果只在
print
语句末尾添加逗号,而不是打印换行符,则会添加一个“智能空格”。这有点棘手,但是这个想法应该是在应该的时候增加一个空间,而在不应该的时候什么也不增加。与大多数DWIM算法一样,它并不总是正确的,但在本例中,它确实:

with open("a.txt") as f:
    for line in f:
        print line,
当然,我们现在假设文件的换行符与您的终端的换行符相匹配——如果您在Unix终端上尝试使用经典Mac文件,那么您将在最后一行上打印每一行。同样,您可以通过使用通用换行符来解决这个问题

无论如何,您可以通过使用print函数而不是print语句来避免智能空间的DWIM魔力。在Python2.x中,您可以通过使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
声明来实现这一点:

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

或者您可以使用第三方包装库,如
six
,如果您愿意。

这在Windows(或OS X之前的Mac OS)上失败,因为换行符不是
\n
。如果文件a.txt不存在,这也会失败。@EOL AFAIK,我可能是错的,在python中以文本模式打开的文件的所有行尾都隐式转换为“\n”。您可以简单地对f:print(line.rstrip())中的行执行
,或者您可以使用它(如果您希望具体化)。奇怪的是,我刚刚在Windows7上运行了它,它按预期工作。没有“rU”,确切的代码就是发布的代码。虽然这可以正确地处理多个操作系统的各种换行约定,但在Python 2和Python 3中,此解决方案都可能占用大量内存:不仅整个文件在内存中读取,而且还通过其行列表进行复制。因此,这是一种有效的方法,但仅适用于不太大的文件。请注意,如果此解决方案使用带
,则最终会释放内存,就像在其他一些答案中一样。@EOL:带
不会影响释放内存。无论是否关闭文件,无论哪种方式,巨型
f
字符串的活动时间都完全相同。(当然,最好不要泄露文件句柄。这与GC'ing
f
f.splitlines
无关)@abarnert:你说得对。我不知道为什么我写了这样一篇文章:使用
可以释放内存(所涉及的内存量实际上可以忽略不计)。
strip()
也会删除前导空格,因此当输入文件包含以空格开头的行时,此解决方案无法正确打印输入文件。实际上,您需要
rstrip()
。即使是
rstrip()
也不太好:它删除了换行符(这很好),但也删除了尾随空格,这会以某种可能不需要的方式修改输入文件的行,因此即使是
rstrip()
版本也不能完全满足需要。OP显然使用的是Python 2,而且我不确定为2.x用户推荐
print\u功能总是一个好主意。如果你不先了解它的含义和工作原理,那么使用
打印
的魔法软空间可能是个坏主意。这意味着您的显式
写入
可能是最佳答案(这就是为什么我对您的答案投了更高的票,并且认为OP接受它是正确的)。剥离
\r
是无用的,因为您以文本模式打开了文件:在必须剥离它之前,
\r
字符已被删除。仅适用于Python2和用于文本文件的二进制模式(与Python3不兼容)