2011-01-24 32 views

Trả lời

45
searchfile = open("file.txt", "r") 
for line in searchfile: 
    if "searchphrase" in line: print line 
searchfile.close() 

Để in ra nhiều dòng (một cách đơn giản)

f = open("file.txt", "r") 
searchlines = f.readlines() 
f.close() 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     for l in searchlines[i:i+3]: print l, 
     print 

Dấu phẩy trong print l, ngăn chặn thêm dấu cách xuất hiện trong đầu ra; báo cáo in dấu vết phân tách các kết quả từ các dòng khác nhau.

Hoặc tốt hơn (ăn cắp trở lại từ Mark Ransom):

with open("file.txt", "r") as f: 
    searchlines = f.readlines() 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     for l in searchlines[i:i+3]: print l, 
     print 
+1

đóng tệp sau khi xử lý. – Rozuur

+2

Làm cách nào để in dòng đó và ba dòng khác bên dưới? –

+0

@Rozuur: đủ công bằng. đã chỉnh sửa. – senderle

19
with open('file.txt', 'r') as searchfile: 
    for line in searchfile: 
     if 'searchphrase' in line: 
      print line 

Với lời xin lỗi đến senderle người tôi ngang nhiên sao chép.

+2

+1. Tôi đã bực mình - nhưng sau đó tôi đã dành một chút thời gian để hiểu câu nói đó. Điều đó thật tuyệt! – senderle

+3

@senderle, cảm ơn vì điều đó. Tôi chỉ xem xét việc chỉnh sửa câu trả lời của bạn, nhưng tôi nghĩ điều đó thậm chí còn khó chịu hơn - và câu lệnh 'with' là một bổ sung gần đây cho Python, làm cho câu trả lời của bạn phù hợp nhất với một số người. Bạn đã +1 của tôi từ lâu rồi! –

+1

có, gần đây và với tôi, khó hiểu, bổ sung, cho đến bây giờ; Tôi phải thừa nhận rằng tôi đã đấu tranh để lúng túng tuyên bố với một vài tuần trước và đã đi lên trống - nhưng ví dụ đơn giản này giải thích nó hoàn hảo. – senderle

2

Lưu ý tiềm năng cho chỉ mục ngoài phạm vi có "i + 3". Bạn có thể làm điều gì đó như:

with open("file.txt", "r") as f: 
    searchlines = f.readlines() 
j=len(searchlines)-1 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     k=min(i+3,j) 
     for l in searchlines[i:k]: print l, 
     print 

Chỉnh sửa: có thể không cần thiết. Tôi vừa thử nghiệm một số ví dụ. x [y] sẽ đưa ra lỗi nếu y nằm ngoài phạm vi, nhưng x [y: z] dường như không đưa ra lỗi cho các giá trị phạm vi của y và z.

+0

Cắt lát không tạo ra lỗi phạm vi. Khi bạn lấy một lát, bạn nói "cung cấp cho tôi một danh sách các mục trong phạm vi này". Nếu không có mục nào trong phạm vi nhất định, thì danh sách trống sẽ phân phối những gì được yêu cầu. Mặt khác, lập chỉ mục cho biết "cung cấp cho tôi mục chính xác tại chỉ mục' i'. " Nếu không có mục nào tại 'i', sau đó trả về một cái gì đó - thậm chí là' None' - sẽ là một lời nói dối, vì vậy tốt hơn là nên đưa ra một ngoại lệ. – senderle

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