2009-05-05 16 views
21

Başka bir programdan hataları günlüğe kaydeder ve bir hatayla karşılaştığında bıraktığı programı yeniden başlatan bir komut dosyası yazıyorum. Hangi sebepten ötürü, bu programın geliştiricileri bu işlevi varsayılan olarak programlarına koymanın gerekli olmadığını hissetmişlerdir.Dosyaları ve döngüler karıştırma

Her durumda, program bir girdi dosyası alır, ayrıştırır ve bir çıkış dosyası oluşturur. Giriş dosyası belirli bir biçimde geçerli:

UI - 26474845 
TI - the title (can be any number of lines) 
AB - the abstract (can also be any number of lines) 

programı bir hata atar, bu size hatayı izlemek için ihtiyaç referans bilgi verir - yani, UI, bölüm (başlık veya soyut) ve başlığın veya özetin başlangıcına göre satır numarası. Giriş dosyasından gelen suçları, referans numarasını ve dosyayı alan, cümleyi bulan ve onu kaydeden bir işlevle kaydetmek istiyorum. Bunu yapmayı düşünebilmemin en iyi yolu, dosya boyunca belirli bir sayıda ilerlemeyi (n, n'nin, secitonun başlangıcına göre satır numarasıdır) içermesini içerir.

i = 1 
while i <= lineNumber: 
    print original.readline() 
    i += 1 

Bu beni verileri kaybetmek yapacak nasıl görmüyorum, ama Python it would düşünür ve ValueError: Mixing iteration and read methods would lose data diyor ki: Bunu yapmak için mantıklı görünüyordu yoludur. Bunu nasıl yapacaklarını bilen var mı?

+1

-1: Kod pasajı eksik. Muhtemelen, gösterilen koddan eksik olan bir "orijinalde bir şey için" var. –

cevap

44

Değer kodunuz, original.readline()'a ek olarak muhtemelen for line in original: kodunuza sahip olduğunuzdan alırsınız. daha fazla bellek yavaş programınızı yapmadan sorunu giderip veya tüketmek kolay bir çözümü tek bir hatta ihtiyacı varsayarsak

while True: 
    line = original.readline() 
    if not line: break 
    ... 
+1

Kafandaki çiviye çarptığında - I * de olduğu gibi, için de kullanıyordu. Bu en hızlı düzeltme oldu. Teşekkürler ve herkesin verdiği cevaplar için teşekkürler. –

+0

da bana yardım etti. teşekkür ederim. – nish

+0

Bu işe yaramıyor. Sonsuz bir döngüye giriyor. Sanırım bir Hiçbiri değeri vermez. – lionel319

10

for ve enumerate'u kullanın.

Örnek:

for line_num, line in enumerate(file): 
    if line_num < cut_off: 
     print line 

NOT: Bir daha işlevsel lezzet isterseniz bu zaten vb Ayrıca

dosya kolları, temizliyor varsayar takewhile işlevi faydalı olabilir.

0

için

for line in original: 
    ... 

değişiyor, bu bir yardım olabilir

import itertools 

def getline(fobj, line_no): 
    "Return a (1-based) line from a file object" 
    return itertools.islice(fobj, line_no-1, line_no).next() # 1-based! 

>>> print getline(open("/etc/passwd", "r"), 4) 
'adm:x:3:4:adm:/var/adm:/bin/false\n' 

StopIteration hatalarını yakalamak isteyebilirsiniz (dosyada daha az satır varsa).

0

Burada çirkin while True desen olmadan ve diğer modüllerin olmadan sürümü:

for line in iter(original.readline, ''): 
    if …: # to the beginning of the title or abstract 
     for i in range(lineNumber): 
      print original.readline(), 
     break