2011-11-18 22 views
6

Bir dosyadan geçiyorum ve bir şey bulursam, denetimi ana döngüye döndürmeden önce bir şeyler aramak için birkaç satır okumak isterim. Bununla birlikte, ileriye bakmayı bıraktığım noktada kontrol etmek istiyorum.Bir dosyada Python ile döngü yaparken nasıl okunur?

örnek kod:

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. 

Numune girişi:

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

İstenilen çıktı:

1 2 3 4 5 
6 7 8 9 0 

yapmak için daha iyi bir yolu olup olmadığını bu yüzden, Python de oldukça yeni İleriye bakmak için bir döngü kullanmak dışında, onu gördüğüme sevindim.

cevap

4

Açık dosyalar arasında geçiş yaptığınızda, her satırı yalnızca bir kez alabilirsiniz. Bu, her bir döngü için listenin tamamında kendi yineleyicisini alacağı listelerden farklıdır.

Sen dış döngü onları görmek için almaz, böylece bir iç döngü, dosyadan satırları “çalmak” sahip olabilir:

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 

kadar okuyun nasıl daha fazla bilgi için iterators eser.

+0

dosyasında satır için 'Yani iç:' dış bir bıraktığı çizgileri alarak başlar? Dosyanın başından başlayacağını düşünürdüm. – astay13

+2

@astay: İç/dış ile ilgisi yok. Bu kodda tam olarak bir yineleyici var. ''daki bir şey için, iteratör StopIteration’ı yükseltirceye kadar bir sonraki şeyi elde etmek için döngüler alır. Döngünün dışına çıkıp bir sonraki şeyi elde etmeye devam edecek başka bir döngü başlatabilirsiniz. –

+0

@John ve Petr, Dosyaları/yineleyicileri daha iyi anlamama yardımcı olduğunuz için teşekkürler! Bu çözümü seçiyorum çünkü kodum 500 satır ileriye bakmayı gerektiriyordu. – astay13

4

İhtiyacınız yoksa ileride okumak iyi bir fikir değil, buradaki durum böyledir. Yapmanız gereken şey, tek bir devlet döngüsünü koruyarak, tek bir döngüde gerçekleştirilebilir. Bu , denetimi yapılmasına izin verir ve , çok daha karmaşık gereksinimlere kadar, aynı yineleyici üzerinden iç içe geçmiş döngülerle işlenebilecek ölçekleri ölçeklendirir.

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 
İlgili konular