2011-11-18 37 views
6

Tôi đang lặp qua một tập tin và nếu tôi tìm thấy một cái gì đó, muốn đọc trước một số dòng tìm kiếm một cái gì đó trước khi trở về kiểm soát vòng lặp chính. Tuy nhiên, tôi muốn trở lại kiểm soát tại thời điểm mà tôi ngừng nhìn về phía trước.Làm thế nào để đọc trước một tệp khi lặp qua nó bằng Python?

Mẫu mã:

for line in file: 
    line = line.strip() 
    llist = line.split() 

    if llist[0] == 'NUMS': 
     # some loop to read ahead and print nums on their own line 
     # until it finds END, then return control to the main for 
     # loop at the point where it stopped looking ahead. 

đầu vào mẫu:

NUMS 
1 
2 
3 
4 
5 
END 
SOME 
MORE 
STUFF 
NUMS 
6 
7 
8 
9 
0 
END 

đầu ra mong muốn:

1 2 3 4 5 
6 7 8 9 0 

Tôi khá mới tại Python, vì vậy nếu có một cách tốt hơn để làm ngoài việc sử dụng vòng lặp để nhìn về phía trước, tôi rất vui khi thấy nó.

Trả lời

4

Khi bạn lặp qua các tệp đang mở, bạn chỉ có thể nhận được mỗi dòng chính xác một lần. Điều này không giống như các danh sách, trong đó mỗi vòng lặp sẽ có trình lặp của riêng nó trong toàn bộ danh sách.

Bạn có thể có một vòng lặp bên trong “ăn cắp” dòng từ tập tin, do đó vòng lặp bên ngoài không có thể nhìn thấy chúng:

for line in file: 
    line = line.strip() 
    llist = line.split() 

    if llist and llist[0] == 'NUMS': 
     for line in file: 
      line = line.strip() 
      if line == 'END': 
       break 
      else: 
       print line, 
     print # newline 

Đọc trên bao iterators công việc để biết thêm thông tin.

+0

Vì vậy, bên trong 'cho dòng trong tệp:' bắt đầu lấy các dòng bên ngoài dòng bên trái? Tôi đã nghĩ rằng nó sẽ bắt đầu lại từ đầu tập tin. – astay13

+2

@astay: Không liên quan gì đến bên trong/bên ngoài. Có chính xác một trình lặp trong mã này. 'cho điều trong ' chỉ vòng quanh nhận được điều tiếp theo cho đến khi iterator tăng StopIteration. Bạn có thể thoát ra khỏi vòng lặp và bắt đầu một vòng lặp khác mà sẽ tiếp tục nhận được điều tiếp theo. –

+0

@ John và Petr, Cảm ơn bạn đã giúp tôi hiểu các tệp/trình vòng lặp tốt hơn! Tôi chọn giải pháp này vì mã của tôi sẽ yêu cầu khoảng 500 dòng nhìn về phía trước. – astay13

4

Không nên đọc trước nếu bạn không cần, đây là trường hợp ở đây. Những gì bạn cần làm có thể được thực hiện trong một lần duy nhất cho vòng lặp, bằng cách duy trì một chút trạng thái. Điều này cho phép kiểm tra lỗităng lên đến nhiều yêu cầu phức tạp hơn hơn có thể được xử lý bởi các vòng lồng nhau trên cùng một trình lặp.

guff = """NUMS 
1 
2 
etc etc 
9 
0 
END""" 

state = "" 
for item in guff.split(): 
    if item == "NUMS": 
     if state == "NUMS": print "missing END" 
     state = "NUMS" 
    elif item == "END": 
     if state == "": print "missing NUMS" 
     state = "" 
     print 
    elif state == "NUMS": 
     print item, 

if state == "NUMS": print # missing END 
Các vấn đề liên quan