19

输入文件:a.txt

aaaaaaaaaaaa
bbbbbbbbbbb
cccccccccccc

蟒蛇代码:

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

问题:

aaaaaaaaaaaa

bbbbbbbbbbb

cccccccccccc

如您所见,输出在每个项目之间都有额外的行。

如何防止这种情况?

4

5 回答 5

22

print追加一个换行符,并且输入行已经以换行符结尾。

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

import sys

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

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

于 2013-08-03T02:00:12.770 回答
10

正如其他答案所解释的,每一行都有一个换行符;当你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 换行文件,或者一个本地到任何平台的本地文件,我正在运行-on-right-now-newline 文件,您可以去掉适当的结尾明确:

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.stdoutwith sys.stdout.write(line),你也可以从print它自己来做到这一点。

如果您只是在print语句的末尾添加一个逗号,而不是打印换行符,它会添加一个“智能空格”。这究竟意味着什么有点棘手,但这个想法应该是它应该添加一个空格,而不应该添加一个空格。像大多数 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或者,如果您愿意,也可以使用第三方包装库,如 。

于 2013-08-03T03:17:57.863 回答
2

发生的情况是,每行末尾都有一个换行符,printpython 中的语句也添加了一个换行符。您可以删除换行符:

with open("a.txt") as f:
    for line in f:
        print line.strip()
于 2013-08-03T02:00:02.900 回答
1

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

f = open('a.txt').read()
for l in f.splitlines():
    print l
于 2013-08-03T02:02:27.283 回答
0

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

尝试:

with open ("a.txt") as f:
    for line in (x.rstrip ('\n') for x in f):
        print line
于 2013-08-03T01:57:07.100 回答