2012-02-07 11 views
5

böyle bir for döngüsü kullanarak bir dosya üzerinden okuyorum ...Dosya yineleme, ben ona doğru hattından bir öğeyi almak gerekir okunan her satır hariç hat varlığını

f = open("somefile.txt") 

for line in f: 
    do stuff 

denetleme ve mevcut hatta koy. Bunu yapmanın en iyi yolu nedir? Bir sonraki satırı okumak ya da okumadan bir parça almanın bir yolu var mı? Dosyanız çok büyük değilse

+0

Veya okuyabilmek için bir sonraki satırın var olup olmadığını bir şekilde kontrol edebilir miyim? –

+0

Ne demek 'o anki hatta koymak' ile ??? İlerideki satırda bulunan verilerle sabit sürücüdeki kayıtlı bir satırı değiştirmek ister misiniz? – eyquem

cevap

6

ve sırayla her satırda çalışmak istiyorum: @eyquem önerdiği gibi, ayrıca iki kez dosyayı açabilirsiniz Bir sonraki satırından, benim önerim şu anda okumakta olduğunuz değeri depolamak ve son değere üzerinde çalışmaya basitçe olacaktır. tersten Çalışma - last_line mevcut çizgidir ve hat sonraki biridir. Matematiksel olarak

last_line = None 

with open("somefile.txt") as f: 
    for line in f: 
     if not last_line == None: 
      do_stuff(last_line, extract_needed_part(line)) 
     last_line = line 
do_stuff(last_line) #The final line without anything following it. 

yerine satır n ve satır n + 1, satır n-1 ve hat n yapmak. Aynı etkisi.

Bu yönteme baş o başında dosyanın tamamını yükleme anlamına gelmez edilir.

+0

Keşke cevabınızı oylayabilsem de maalesef henüz 15 itibarım yok hah. Yine de teşekkürler, bunu faydalı buldum. –

+0

@ user1178682 Sorununuzu çözdüyse cevabımı kabul edebilirsiniz: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

3

, sen belleğe okuyabilir ve orada kullanın:

f = open("somefile.txt") 
lines = f.readlines() 
f.close() 

for index, value in enumerate(lines): 
    # Check if next line exists 
    if index + 1 > len(lines): 
     next_line = lines(index + 1) 
     # do something with line and next_line 

Düzenleme:

büyük dosyalar için, sadece önceki hatırlamak kolay olurdu satır:

Verilerinizin neye benzediğine bağlı olarak kenar kutuları olabilir. Hatlarınız her zaman çift olarak gelir mi, yoksa belirli durumlarda bir sonraki satırdan biraz bilgiye ihtiyacınız var mı? Dosyanız yalnızca bir satır varsa

Mesela bu kod şey yapmayacağım. Dosya belleğe sığıyorsa

+0

Sorun şu ki, dosyalar oldukça büyük, başlangıçta her satırı hafızaya kaydetmeden işlem yapmak istiyorum. Bilmediğim bir yöntem olacağını umuyordum. Eğer tüm bunlar başarısız olursa, bu iyi bir yedekleme seçeneğidir. Cevabınız için teşekkürler. –

+0

Düzenlemeniz için verdiğiniz örnekte, cevabımın bir yinelemesidir, bununla birlikte kullanmamanız (sizin yapmanız gereken) ve ilk uygulama için, önceki satır ve satırlar aynı olacaktır. –

+0

Gerçek kodumda (uyumluluk için) yerine bir try, IOException deyim var. Bu, bir dosyanın var olduğunu varsayabileceğimiz ve hata vermeyeceğimiz bir genellemeden daha fazlasıdır. Bununla birlikte, fikir birliği sadece bir önceki çizgiye asılmak gibi görünüyor. En iyi yolu ise, bunu kullanacağım. –

0

, böyle bir şey deneyebilirsiniz:

f = open('somefile.txt') 
lines = f.read().splitlines() 

for current_line, next_line in zip(lines, lines[1:]): 
    print current_line 
    print next_line 
    print '-------' 
temelde Yukarıdaki kod tüm hatları okur ve geçerli satırı ve sonraki içeren dizilerini bir liste oluşturmak için zip kullanır

bir. Bu durumda

import itertools 
f = open('somefile.txt') 
i1, i2 = itertools.tee(f) 
lines = itertools.izip(i1, itertools.islice(i2, 1, None)) 
for current_line, next_line in lines: 
    print current_line 
    print next_line 
    print '-------' 

:

Düzenleme: şöyle Alternatif uzun dosyalar için, sen itertools kütüphanesini kullanabilirsiniz

  • itertools.tee (akım için bir tane iki indenpendent yineleyicinızı oluşturmak için kullanılır orijinal dosya yineleyicisini kullanan satır ve bir sonraki satır için).
  • itertools.slice
  • ikinci satırında bir sonraki hat yineleyici başlatmak için kullanılır.
  • itertools.izip
  • bir demet içinde hattı ile hem de yinelemeler hattı sonuçlarını birleştirmek için kullanılır.

Düzenleme 2: Bazı değeri kullanarak, benim anlayış doğru ise

import itertools 
f = open('somefile.txt') 
g = open('somefile.txt') 
lines = itertools.izip(f, itertools.islice(g, 1, None)) 
for current_line, next_line in lines: 
    print current_line 
    print next_line 
    print '-------' 
+1

** tee() ** kullanmaya gerek yoktur. Sadece başka bir dosya işleyicisi tanımlayın: '' g = open ('somefile.txt') '' ve g.readline() '' ile bir satır ileriye hareket ettirin. Daha sonra '' satırları g (g) 'nin satır satırına ((f.readline(), satır) g)' ' – eyquem

+0

@eyquem Yorumunuz için teşekkürler. Yorumunuzu dahil etmek için cevabı düzenledim. – jcollado

0
with open('somefile.txt') as f, open('somefile.txt') as g: 
    g.readline() 
    lines = ((f.readline(),line) for line in g) 
     for precline,aheadline in lines: 
      # do what you want