我无法弄清楚为什么代码#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
答案 0 :(得分:14)
print语句中的尾随,
将压缩换行符。你的第一个打印声明没有,第二个打印声明没有。
您阅读的输入仍然包含导致额外换行的\n
。补偿它的一种方法是通过使用尾随逗号来防止打印发出自己的换行符。或者,可以说是更好的方法,您可以在阅读时删除输入中的换行符(例如,使用rstrip()
)
答案 1 :(得分:3)
此问题的最佳一般答案是在您阅读后立即删除尾随换行符(如果有!):
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语句末尾使用逗号来补偿输入中的换行符并不是一个强大的解决方案。
答案 2 :(得分: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
答案 3 :(得分: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'))
。
答案 4 :(得分:1)
There is a very simple fix for this.
Let's say I have, for arguments sake, a .txt file (called numbers.txt) which I am reading from with the values:
234234
777776
768768
Then, using the following code:
filename = numbers.txt
with open(filename) as file_object:
for line in file_object:
print(line)
Would give you the extra blank line as you are having problems with. But with a small change, you can get rid of the extra blank lines using the rstrip() method. So the code becomes:
filename = numbers.txt
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
Now you will get your results without those annoying blank lines between them!