13

我不明白为什么代码#1 返回一个额外的空行,而代码#2 没有。有人可以解释一下吗?不同之处在于代码 #2 末尾的额外逗号。

# Code #1
file = open('tasks.txt')

for i, text in enumerate(filer, start=1):
    if i >= 2 and i <= 4:
        print "(%d) %s" % (i, text)

# Code #2
file = open('tasks.txt')

for i, text in enumerate(filer, start=1):
    if i >= 2 and i <= 4:
        print "(%d) %s" % (i, text),

这是我的 tasks.txt 文件的内容:

line 1
line 2
line 3
line 4
line 5

代码 #1 的结果:

(2) line 2

(3) line 3

(4) line 4

代码 #2 的结果(期望的结果):

(2) line 2
(3) line 3
(4) line 4
4

5 回答 5

20

打印语句中的尾随,将取消换行。你的第一个打印语句没有,你的第二个有。

您阅读的输入仍然包含\n导致额外换行的内容。补偿它的一种方法是通过使用尾随逗号来防止打印发出自己的换行符。或者,可以说是一种更好的方法,您可以在阅读时去掉输入中的换行符(例如,通过使用rstrip()

于 2012-05-04T21:24:51.603 回答
5

对此问题的最佳一般答案是在您阅读后立即删除尾随换行符(如果有的话!):

f = open('tasks.txt')
for i, text in enumerate(f, start=1):
    text = text.rstrip('\n')
    if i >= 2 and i <= 4:
        print "(%d) %s" % (i, text)

这样,您就可以将输出与输入分离……您的输出代码可能在 20 行之外,或者在不同的函数/方法中,甚至在不同的模块中。通过在 print 语句末尾使用逗号来补偿输入中的换行符并不是一个可靠的解决方案。

于 2012-05-04T21:51:24.587 回答
2

为了没有空行,您需要,在打印语句的末尾

例子:

for i in range(10):
    print i,

>>>0 1 2 3 4 5 6 7 8 9

for i in range(10):
    print i

>>>
0
1
2
3
4
5
6
7
8
9
于 2012-05-04T21:30:44.737 回答
2

有一个非常简单的解决方法。

假设我有一个 .txt 文件(称为 numbers.txt),我正在读取其中的值:

234234
777776
768768

然后,使用以下代码:

filename = numbers.txt

with open(filename) as file_object:
    for line in file_object:
        print(line)

当您遇到问题时,会给您额外的空白行。但只要稍作改动,您就可以使用 rstrip() 方法去除多余的空白行。所以代码变成了:

filename = numbers.txt

with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

现在你会得到你的结果,它们之间没有那些烦人的空白行!

于 2017-05-16T09:35:10.413 回答
1

遍历文件会保留文件中的换行符。所以你的打印中有一个换行符,字符串中有一个换行符。

测试文件语义的一个好方法是使用StringIO. 看一看:

>>> from StringIO import StringIO
>>> x = StringIO("abc\ncde\n")
>>> for line in x: print repr(line)
... 
'abc\n'
'cde\n'

正如 Levon 所说,逗号抑制了打印中的换行符,因此字符串中只有换行符。

我使用s.rstrip('\n'). 它消除了任何现代格式(Unix、Windows 或旧 Mac OS)的任何尾随换行符。所以你可以这样做print "(%d) %s" % (i, text.rstrip('\n'))

于 2012-05-04T21:25:47.953 回答