2012-07-06 13 views
5

Bir dosyayı okumalıyım, hat satırında ve 'sonraki satır' içine göz atmam gerekiyor, bu yüzden önce dosyayı bir listeye okudum ve sonra listeyi değiştirdim ... bir şekilde bu görünüyor kaba, listeyi oluşturmak pahalı olabilirdi.dosya erişim peek ahead

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 

hattı üzerinden yineleme için daha iyi bir yolu olmalı ama önceden

+2

Neden devam gözetleme gerekiyor? Önünüzdeki "göz atma" işleminin gerçekleştiği yerdeki kodunuzdan ve bunu nasıl kullandığınızdan anlaşılmıyor. – unwind

+2

Ben o peek önden bölüm ayrıldı, ben büyük ve benim için şimdi çok kolay değil, benim için ayaklarımın üzerinde durursam gerçekten çok güzel, – Paul

cevap

6

bu şekilde yapabileceğini gözetleme için nasıl bilmiyorum itertools'dan pairwise tarifi gibi bir şey.

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

göz açıklığı ışık dökmüyordu, sadece dokunabilirsiniz, thanx! – Paul

+0

tamam, itertoollarda daha iyi bir kavrama elde ediyor, ancak ... bir sonraki tam anlamını kavrayamadığında (b, Yok) ... – Paul

+1

@Paul, iterator b ileriye doğru bir öğe ilerletir. Bir yineleyicide hiç öğe kalmadıysa, 'StopIteration' yükselecektir. 'next ', hata oluştuğunda, bunun gerçekleşmesi durumunda döndürdüğü bir varsayılan argümanı kabul eder. “Hiçbiri” sadece yer tutucu olarak kullanılır çünkü yineleme sonuna ulaşmış olsaydık, yine de bu değeri kullanmayacağız. – jamylak

1

Sizin için arıyor olabilir

last_line = None 

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

Bir iterator oluşturup böyle yapabilirdi:

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' zaten dosyanın satırları üzerinde bir yineleyicidir, dolayısıyla' y' için gerek yoktur. Ayrıca '__next__' diye adlandırdığınızdan beri python 3 kullandığınızı farz ediyorum, eğer gerçekten ihtiyacınız varsa 'next (y)' yi kullanmalısınız. Aynı dosyayı iki kez açmanın iyi bir fikir olduğunu sanmıyorum, çözümüm bunu yapmak için 'tee 'kullanıyor. Dosyaları da kapatmalı ya da 'with' bloğunu kullanmalısınız. – jamylak

+0

'next (y)' python 3'te çalışmaz. Ve g bir 'TextIOWrapper' nesnesidir. Bu yüzden yinelenebilir bir nesne olsa bile 'next()' metoduna sahip değildir. Ve evet, muhtemelen aynı dosyayı iki kez açmak iyi bir fikir değil, sadece okuma modunda, bu yüzden çok fazla zarar vereceğini düşünmeyin. – Vizard

+0

Evet, 'tee 'kullanmak muhtemelen daha iyi bir yaklaşımdır, ancak mümkün olduğunca basitleştirmeye çalışmıştır. – Vizard

İlgili konular