2012-05-04 78 views
8

我找不到爲什麼代碼#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文件的內容:

(2) line 2 

(3) line 3 

(4) line 4 

從代碼#2(期望的結果)結果::

line 1 
line 2 
line 3 
line 4 
line 5 

從碼#1結果

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

回答

13

在後,打印語句將抑制換行。你的第一張印刷聲明沒有,你的第二張沒有。

你讀的輸入仍然包含這會導致額外的換行符的\n。補償它的一種方法是通過使用尾隨逗號來防止打印發出自己的換行。另外,也可以說是一種更好的方法,當您閱讀時可以在輸入中去掉換行符(例如,通過使用rstrip()

+0

謝謝,我沒有意識到這一點。我只是看着它。 Python 3.0似乎包含了一些額外的功能。如果我理解正確的話,你可以定義如何在Python 3.0+中結束你的代碼[在這裏找到它](http://docs.python.org/release/3.1.5/whatsnew/3.0.html#print-is-a -功能)。感謝您指出錯誤,是的,我的意思是代碼#2。固定。 – finspin

+0

@Jaro您說得對,文檔中的部分指出了Python 2.x和3.x之間打印的相關差異。 – Levon

1

對文件進行迭代保持文件中的換行符。所以你的印刷品中有一個換行符,而字符串中有一個換行符。

測試文件語義的一個好方法是使用StringIO。請看:

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

逗號抑制從打印換行符,作爲列翁說,這樣有隻從字符串的換行符。

我使用s.rstrip('\n')從字符串剝離換行符。它擺脫了任何現代格式(Unix,Windows或舊的Mac OS)的任何尾隨換行符。所以你可以改爲print "(%d) %s" % (i, text.rstrip('\n'))

+0

感謝您的提示! – finspin

+0

-1如果(如您所願)以文本模式打開文件,行分隔符將改爲「\ n」,因此您只需要'.rstrip('\ n')'。如果在行尾留下了''r'',那麼''r''就是** DATA **的一部分,可能是由於文件的製作者有些困惑。 –

+1

@John你錯了。行分隔符在Windows上從'\ r \ n'變爲'\ n',但在Unix上不變。也就是說:如果我們按照您的建議進行操作,相同的文件在不同的操作系統上的表現會有所不同也許這就是我們想要的,但這不是你所說的。然而,如果我們用'rU'來閱讀,他們閱讀的是相同的,那麼就沒有必要去掉'\ r'。 –

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 
+1

在** python3 **中,它對於範圍(10)中的i:print(i,end =「」)' – erik

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行以外,或者在不同的功能/方法中,甚至在不同的模塊中。通過在打印語句末尾使用逗號來補償輸入中的換行符不是一個可靠的解決方案。

1

對此有一個非常簡單的修復方法。

比方說,我有,爲了參數,一個.txt文件(稱爲數字。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()) 

現在你將得到你的結果沒有那些惱人的空白行之間!