2015-02-24 9 views
8

dışında bir bir dosyaya arasında yineleme, tek yapabileceği -Pythonictir yolu çizgilerle bir dosya yineleme için satırbaşıyla

(f dosya Yineleyicinin)
for line in f: 

.

Dosyayı, yeni satırlarla ayrılmış bloklar yerine virgüllerle ayrılmış bloklara göre yinelemek istiyorum. Bütün satırları okuyabiliyorum ve daha sonra dizgiyi virgüllere ayırabiliyorum, ama bunu yapmanın pythonik yolu nedir? ayrılmasına

cevap

3

Bıkmadan o zaman tüm hatları saklamak gerekmez gitmek gibi:

for line in f: 
    for lines in line.split(","): 
+1

teşekkürler cevap için bir çok! – Illusionist

+4

Bir satırsonu karakterinin iki virgül arasında bir yere düştüğü durumu düşünün. – thefourtheye

+1

@Illusionist, endişelenme. Bu, büyük bir dosya için sorun olabilecek tüm satırları ve bellekte bölünmüş satırları saklamanızı sağlayacaktır. –

2

Kullanım dize split() yöntem virgül ile içerik bölmek.

örn.

input_file = "/home/vivek/Desktop/Work/stack_over/href_input.html" 
#- Read File content. 
with open(input_file, "rb") as fp: 
    content_list = fp.read().split(",") 

Bıkmadan dosya satır satır ve gerçekten bir dev (örn 1TB) şunları yapabilirsiniz sınırlayıcı tarafından tek hat dosya ve süreç öğeleri taramak gerekiyorsa virgül

>>> with open(input_file, "rb") as fp: 
... for f in fp: 
...  for i in f.split(","): 
...   i 
+1

Bu, dosya nesnesi üzerinde yinelenen tüm noktayı öldürür. Sisteminizin hafızasının iki katı veya üç katı olan bir dosya düşünün. – thefourtheye

+0

@thefourtheye Bu 0,1% davası gibi değil mi? Sence bu, RAM'inizden kaçarak gerçekten başarısız olacak mı? –

+0

@thefourtheye: evet, fakat dosya satırını okuyoruz, sonra virgülle ayrılmış değil. –

0

nispet tarafından her satırını yineleme dosyayı bloklara göre okuyabilir, böler ve sınır efektlerini işleyebilir. onunla yardımcı olabilir İşte jeneratör:

def split_file(file, delim, block_size=1024*1024): 
    block = True 
    last_item = '' 
    while block: 
     block = file.read(block_size) 
     items = block.split(delim) 
     for i in xrange(len(items)-1): 
      item = items[i] 
      if last_item: 
       yield last_item + item 
       last_item = '' 
       continue 
      if item: 
       yield item 
     last_item += items[-1] 

Sadece bu gibi kullanabilirsiniz:

f = open("names.in.txt") 
for name in split_file(f, ","): 
    print name # process one item there 
İlgili konular