2012-05-04 34 views
8

Tôi không thể hiểu tại sao mã # 1 trả về một dòng trống thừa trong khi mã # 2 thì không. Ai đó có thể giải thích điều này? Sự khác biệt là dấu phẩy thêm ở cuối mã số 2.Dòng bổ sung trong đầu ra khi in bên trong một vòng lặp

# 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), 

Dưới đây là nội dung của tập tin tasks.txt tôi:

line 1 
line 2 
line 3 
line 4 
line 5 

Kết quả từ mã # 1:

(2) line 2 

(3) line 3 

(4) line 4 

Kết quả từ mã # 2 (kết quả mong muốn):

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

Trả lời

13

Đường nhỏ , trong báo cáo in sẽ nhấn mạnh nguồn cấp dữ liệu. Bản in đầu tiên của bạn không có, cái thứ hai của bạn.

Đầu vào bạn đọc vẫn chứa số \n làm cho dòng thêm thừa. Một cách để bù đắp cho nó là để ngăn chặn in từ việc phát hành một linefeed của riêng nó bằng cách sử dụng dấu phẩy sau. Ngoài ra, và được cho là một cách tiếp cận tốt hơn, bạn có thể tách dòng mới trong đầu vào khi bạn đọc nó (ví dụ: bằng cách sử dụng rstrip())

+0

Cảm ơn, tôi không biết điều đó. Tôi chỉ nhìn nó lên. Có vẻ như Python 3.0 có chứa một số tính năng bổ sung có liên quan đến in. Nếu tôi hiểu đúng, bạn có thể xác định cách kết thúc dòng của mình bằng Python 3.0+ [tìm thấy nó ở đây] (http://docs.python.org/release/3.1.5/whatsnew/3.0.html#print-is-a -chức năng). Và cảm ơn vì đã chỉ ra sai lầm, vâng tôi có nghĩa là mã số 2. Đã sửa. – finspin

+0

@Jaro Bạn nói đúng, phần trong tài liệu chỉ ra sự khác biệt có liên quan cho việc in giữa Python 2.x và 3.x. – Levon

1

Lặp lại các tệp sẽ giữ dòng mới từ tệp. Vì vậy, có một dòng mới từ bản in của bạn và một dòng từ chuỗi.

Cách tốt để kiểm tra ngữ nghĩa tệp là với StringIO. Hãy xem:

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

Dấu phẩy ngăn dòng mới từ bản in, như Levon nói, để chỉ có dòng mới từ chuỗi.

Tôi dải dòng mới từ chuỗi bằng cách sử dụng s.rstrip('\n'). Nó loại bỏ bất kỳ dòng mới nào trong bất kỳ định dạng hiện đại nào (Unix, Windows hoặc Mac OS cũ). Vì vậy, bạn có thể làm print "(%d) %s" % (i, text.rstrip('\n')) để thay thế.

+0

Cảm ơn lời khuyên! – finspin

+0

-1 Nếu (như bạn cần) bạn đang mở tệp ở chế độ văn bản, dấu tách dòng sẽ được thay đổi thành ''\ n'', vì vậy tất cả những gì bạn cần là' .rstrip (' \ n ') '. Nếu điều đó để lại ''\ r'' ở cuối dòng của bạn, thì'' \ r'' đó là một phần của ** DATA ** của bạn, có lẽ là kết quả của nhà sản xuất tệp bị nhầm lẫn. –

+1

@John Bạn sai rồi. Bộ tách dòng thay đổi từ '\ r \ n' thành '\ n' trên Windows, nhưng không thay đổi trên Unix. Đó là: các tệp giống nhau sẽ hoạt động khác nhau trên các hệ điều hành khác nhau nếu chúng tôi thực hiện những gì bạn đề xuất. Có lẽ đây là những gì chúng tôi muốn, nhưng nó không phải là những gì bạn nói. Tuy nhiên, nếu chúng ta đọc bằng 'rU', chúng đọc giống nhau, và sau đó không cần thiết phải loại bỏ '\ r'. –

2

Để không có một dòng trống, bạn cần , ở phần cuối của báo cáo kết quả in

Ví dụ:

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

Trong ** python3 ** nó sẽ là 'cho tôi trong phạm vi (10): in (i, end =" ")' – erik

3

tốt nhất chung câu trả lời cho vấn đề này là tước dấu dòng mới (nếu có!) ngay sau khi bạn đọc:

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) 

Bằng cách đó, bạn không tháo đầu ra khỏi đầu vào của mình .. Mã đầu ra của bạn có thể là 20 dòng hoặc trong một hàm/phương thức khác hoặc thậm chí trong một mô-đun khác. Bồi thường cho một dòng mới trong đầu vào bằng cách sử dụng dấu phẩy ở cuối câu lệnh in không phải là một giải pháp mạnh mẽ.

1

Có một sửa chữa rất đơn giản cho việc này.

Giả sử tôi có, vì lý do, một tệp .txt (được gọi là số.txt) mà tôi đang đọc từ với các giá trị:

234234 
777776 
768768 

Sau đó, sử dụng đoạn mã sau:

filename = numbers.txt 

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

sẽ cung cấp cho bạn các dòng trống thêm như bạn đang gặp vấn đề với. Nhưng với một thay đổi nhỏ, bạn có thể loại bỏ các dòng trống thừa bằng cách sử dụng phương thức rstrip(). Vì vậy, mã sẽ trở thành:

filename = numbers.txt 

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

Bây giờ bạn sẽ nhận được kết quả mà không có những dòng trống khó chịu giữa chúng!

Các vấn đề liên quan