2012-07-06 31 views
5

Tôi cần phải đọc một tập tin, từng dòng và tôi cần nhìn vào 'dòng tiếp theo' vì vậy trước tiên tôi đọc tập tin vào danh sách và sau đó tôi duyệt qua danh sách ... thô lỗ, xây dựng danh sách có thể trở nên đắt đỏ.truy cập tập tin xem trước

for line in open(filename, 'r'): 
    lines.append(line[:-1]) 

for cn in range(0, len(lines)): 
    line = lines[cn] 
    nextline = lines[cn+1] # actual code checks for this eof overflow 

phải có một cách tốt hơn để lặp qua các đường nhưng tôi không biết làm thế nào để nhìn trộm về phía trước

+2

Tại sao bạn cần để peek phía trước? Nó không rõ ràng từ mã của bạn, nơi "nhìn về phía trước" xảy ra, và cách bạn sử dụng nó. – unwind

+2

Tôi để lại cái nhìn trước đó, nó to và không lóe sáng trên màn hình trước – Paul

Trả lời

6

Bạn có thể tìm kiếm một cái gì đó giống như công thức pairwise từ itertools.

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

with open(filename) as f: # Remember to use a with block so the file is safely closed after 
    for line, next_line in pairwise(f): 
     # do stuff 
+1

thật sự rất hay, không dễ với tôi lúc này, nhưng nếu tôi đứng trên ngón chân tôi chỉ có thể chạm vào nó, thanx! – Paul

+0

oke, nắm bắt tốt hơn về các itertools, tuy nhiên ... không nắm bắt được ý nghĩa chính xác của tiếp theo (b, Không) ... – Paul

+1

@Paul nó tiến hành biến lặp b chuyển tiếp một phần tử. Nếu không có phần tử nào còn lại trong một trình lặp, thì 'StopIteration' sẽ được nâng lên. 'next' chấp nhận một đối số mặc định mà nó trả về nếu điều đó xảy ra, thay vì có lỗi được nêu ra. 'None' chỉ được sử dụng như một trình giữ chỗ vì nếu chúng ta đã đạt đến kết thúc của sự lặp lại, chúng ta sẽ không thực sự sử dụng giá trị đó. – jamylak

1

Bạn có thể làm theo cách này

last_line = None 

for line in open(filename):                 
    if last_line is not None: 
     do_stuff(last_line, line) 
    last_line = line               
0

Bạn có thể tạo một iterator và làm điều đó như thế này:

f = open(filename, 'r') 
g = open(filename, 'r') 

y = iter(g.readlines()) 
y.__next__() 

for line in f: 
    print(line) 
    try: 
     print(y.__next__()) 
    except StopIteration: 
     f.close() 
     g.close() 
+0

'g' đã là một trình lặp trên các dòng của tệp, vì vậy không cần' y'. Ngoài ra tôi đoán bạn đang sử dụng python 3 vì bạn gọi là '__next__', bạn chỉ nên sử dụng' next (y) 'nếu bạn thực sự cần. Tôi không nghĩ rằng đó là một ý tưởng tốt để mở cùng một tập tin hai lần anyway, giải pháp của tôi sử dụng 'tee' để làm điều này. Bạn cũng nên 'đóng' các tệp hoặc sử dụng khối' with'. – jamylak

+0

'next (y)' doesnt work in python 3. Và g là một đối tượng 'TextIOWrapper'. Vì vậy, ngay cả khi nó là một đối tượng có thể lặp lại thì nó không có phương thức 'next()'. Và vâng, có lẽ không phải là một ý tưởng tốt để mở cùng một tệp hai lần, nhưng chỉ ở chế độ đọc, vì vậy đừng nghĩ rằng nó gây hại nhiều. – Vizard

+0

Vâng, sử dụng 'tee' có lẽ là một cách tiếp cận tốt hơn, nhưng cố gắng làm cho nó đơn giản nhất có thể. – Vizard

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